Обработка ошибок в С++

Содержание

Слайд 2

Как сообщить об ошибке?

Спецзначение. FILE* file = fopen("Secret.txt", "rt" ); if( file ==

Как сообщить об ошибке? Спецзначение. FILE* file = fopen("Secret.txt", "rt" ); if(
NULL ) //Ааааа мы все умрем!!!
Флаг и код ошибки if( !WriteFile(hOut, Buffer, 256, NULL, NULL ) ) {
cout << "Error: " << GetLastError(); }

Слайд 3

Пичальки

Плохие программисты не проверяют ошибки.
Всегда тратим время на проверку, даже когда все

Пичальки Плохие программисты не проверяют ошибки. Всегда тратим время на проверку, даже
хорошо.
Функция вызывает функцию которая вызывает функцию...
Иногда приходит Боромир

Слайд 4

Нельзя просто так взять и вернуть ошибку...

Нельзя просто так взять и вернуть ошибку...

Слайд 5

class Matrix
{
...
Matrix operator* (const Matrix& right ) const {
if( this->Col != right.Row

class Matrix { ... Matrix operator* (const Matrix& right ) const {
)
return !?!?!
...
}
...
};

Слайд 6

Пичальки

Плохие программисты не проверяют ошибки.
Всегда тратим время на проверку, даже когда все

Пичальки Плохие программисты не проверяют ошибки. Всегда тратим время на проверку, даже
хорошо.
Функция вызывает функцию которая вызывает функцию...
Иногда приходит Боромир
Конструкторы вообще ничего не возвращают

Слайд 7

Исключения (Exceptions)

Обнаружил ошибку - кидайся какаш исключением, и ни о чем больше

Исключения (Exceptions) Обнаружил ошибку - кидайся какаш исключением, и ни о чем
не думай.
Хочешь обработать ошибку - лови и обрабатывай.
Не поймал? Сам виноват.
В ошибку можно засунуть много всякой информации.
Не надо проверять каждую функцию, можно проверять целую кучу кода сразу.

Слайд 9

Создание своих классов ошибок

class MyException: public std::exception
{
std::string m_msg;
public:
MyException( const char*

Создание своих классов ошибок class MyException: public std::exception { std::string m_msg; public:
msg ) :m_msg( msg ) {}
const char* what() const { return m_msg.c_str(); }
};

Слайд 10

void function1()
{
try {
std::cout << " Enter in function1" << std::endl;

void function1() { try { std::cout throw MyException ("Моя ошибочка"); std::vector v(5);
throw MyException ("Моя ошибочка");
std::vector v(5); v.at(10) = 1;
}
catch(...) {
std::cout << " Function1 terminated by exception" << std::endl;
throw;
}
std::cout << " Exit from function1" << std::endl;
}

Слайд 11

void function2()
{
try {
std::cout << "Enter in function2" << std::endl;
function1();

void function2() { try { std::cout function1(); } catch(...) { std::cout throw; } std::cout }
}
catch(...)
{
std::cout << "Function2 terminated by exception" << std::endl;
throw;
}
std::cout << "Exit from function2" << std::endl;
}

Слайд 12

int main ( int argc, char* argv[])
{
try {
function2();
}

int main ( int argc, char* argv[]) { try { function2(); }
catch( const MyException& ex ) {
std::cout << "MyException: " << ex.what();
}
catch( const std::exception& ex ) {
std::cout << "std::exception: " << ex.what();
}
catch( ... ) {
std::cout << "Unknown exception!";
}
return 0;
}

Слайд 13

Enter in function2
Enter in function1
Function1 terminated by exception
Function2 terminated by

Enter in function2 Enter in function1 Function1 terminated by exception Function2 terminated
exception
MyException: Моя ошибочка!

Слайд 14

void function1()
{
try {
std::cout << " Enter in function1" << std::endl;

void function1() { try { std::cout //throw MyException ("Моя ошибочка"); std::vector v(5);
//throw MyException ("Моя ошибочка");
std::vector v(5); v.at(10) = 1; // std::out_of_range
}
catch(...) {
std::cout << " Function1 terminated by exception" << std::endl;
throw;
}
std::cout << " Exit from function1" << std::endl;
}

Слайд 15

Enter in function2
Enter in function1
Function1 terminated by exception
Function2 terminated by

Enter in function2 Enter in function1 Function1 terminated by exception Function2 terminated by exception std::exception: vector!
exception
std::exception: vector!

Слайд 16

void function1()
{
try {
std::cout << " Enter in function1" << std::endl;

void function1() { try { std::cout throw "Неведомая чушь"; std::vector v(5); v.at(10)
throw "Неведомая чушь";
std::vector v(5); v.at(10) = 1; // std::out_of_range
}
catch(...) {
std::cout << " Function1 terminated by exception" << std::endl;
throw;
}
std::cout << " Exit from function1" << std::endl;
}

Слайд 17

Enter in function2
Enter in function1
Function1 terminated by exception
Function2 terminated by

Enter in function2 Enter in function1 Function1 terminated by exception Function2 terminated by exception Unknown exception!
exception
Unknown exception!

Слайд 18

int main ( int argc, char* argv[])
{
try {
function2();
}

int main ( int argc, char* argv[]) { try { function2(); }
catch( const MyException& ex ) {
std::cout << "MyException: " << ex.what();
}
catch( const std::exception& ex ) {
std::cout << "std::exception: " << ex.what();
}
catch( ... ) {
std::cout << "Unknown exception!";
}
return 0;
}

Берем весь код программы в try

Слайд 19

int main ( int argc, char* argv[])
{
try {
function2();
}

int main ( int argc, char* argv[]) { try { function2(); }
catch( const MyException& ex ) {
std::cout << "MyException: " << ex.what();
}
catch( const std::exception& ex ) {
std::cout << "std::exception: " << ex.what();
}
catch( ... ) {
std::cout << "Unknown exception!";
}
return 0;
}

Берем весь код программы в try

Ловим const ссылку!

Слайд 20

int main ( int argc, char* argv[])
{
try {
function2();
}

int main ( int argc, char* argv[]) { try { function2(); }
catch( const MyException& ex ) {
std::cout << "MyException: " << ex.what();
}
catch( const std::exception& ex ) {
std::cout << "std::exception: " << ex.what();
}
catch( ... ) {
std::cout << "Unknown exception!";
}
return 0;
}

Берем весь код программы в try

Ловим const ссылку!

Порядок ловушек важен!