Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемВсеволод Сябрин
1 НГТУ, каф. ВТ Исключения в С++ Макаревич Л. Г.
2 Что такое исключение Исключение или исключительная ситуация – возникновение непредвиденных или аварийных событий при выполнении программы Исключения позволяют отделить программно обнаружение ошибки и ее обработку int fact (int n) { int f; if (n == 0) return 1; if ( n >0 ) { int k = n-1; return n*fact(k); } А если ошибка в конструкторе? А если при ошибке надо делать разные действия в разных случаях?
3 Механизм обработки исключений Появление ошибки Генерация исключения – throw Отыскивается обработчик исключения и управление передается ему Если обработчика нет, то вызывается функция terminate, которая вызывает abort, аварийно завершающую процесс
4 Синтаксис исключений Контроль исключений try {... //Тело контролируемого блока // в теле блока могут вызываться другие функции, а из них – //другие. //Все функции, вызываемые из блока прямо или косвенно, //принадлежат этому блоку } Генерация исключений throw выражение; // Тип выражения определяет тип исключения // Обычно исключение генерируется в функциях // контролируемого блока Обработчики исключений catch( тип имя){/* тело обработчика*/} catch( тип){/* тело обработчика*/} catch( …){/* тело обработчика*/}
5 Пример nt fact (int n) { int f; if ( n < 0) throw -1; if (n == 0) return 1; if ( n >0 ) { int k = n-1; return n*fact(k); } Int main() { int k = fact(5); try { fact (-4); // … } catch ( int) { cout
6 Перехват исключений Создается копия параметра throw в виде статического объекта Идет раскрутка стека с вызовом деструкторов всех локальных объектов Передается объект и управление подходящему обработчику Все обработчики просматриваются последовательно при раскрутке стека на каждом уровне Обработчик найден, если тип объекта, указанный в throw: Тот же, что и в catch ( T, const T, T&, const T& ) Является производным от указанного в catch Является указателем, который может быть преобразован к типу указателя в catch
7 class Hello { public: Hello(){ cout i; if ( i < 0 ) throw "Error!\n"; i = i + 99; } void f2() { Hello h; f1(); cout
8 Выводы Механизм исключений позволяет корректно уничтожать объекты Выделение и освобождение ресурсов удобнее делать в виде классов, причем выделяет ресурс конструктор, а корректно освобождает его – деструктор Класс для исключения можно определить как внутренний класс с конструктором копирования public Для создания копии объекта
9 Список исключений функции void f1() throw ( int, char *){ тело функции } void f1() throw (MyExcept *){ тело функции } void f1() throw (){ тело функции } //нет исключений void f1(){ тело функции } //любые исключения
10 Алгоритм обработки исключений Исключение Непредусмотренное исключение Обработка исключения Нет Да Unexpected() set_unexpected() Да Собственная функция Нет terminate() set_terminated() Да Собственная функция Нет abort()
11 Исключения при работе с динамической памятью #include int handle_program_memory_depletion( size_t ) { // Your code и выбрасывание исключения } int main( void ) { _set_new_handler( handle_program_memory_depletion ); int *pi = new int[BIG_NUMBER]; } Можно сохранить адрес старого обработчика и использовать его позднее: _PNH old_handler = _set_new_handler( my_handler ); // Code that requires my_handler _set_new_handler( old_handler ) // Code that requires old_handler _PNH _set_new_handler( _PNH pNewHandler ); typedef int ( * _PNH )( size_t );
12 The unexpected routine Calls terminate or function you specify using set_unexpected. void unexpected( void ); unexpected calls terminate by default. You can change this default behavior by writing a custom termination function and calling set_unexpected with the name of your function as its argument. unexpected calls the last function given as an argument to set_unexpected. RoutineRoutine Required headerRequired header CompatibilityCompatibility unexpectedunexpected ANSI, Win 98, Win Me, Win NT, Win 2000, Win XPANSI, Win 98, Win Me, Win NT, Win 2000, Win XP unexpected_function set_unexpected( unexpected_function unexp_func ); The set_unexpected function installs unexp_func as the function called by unexpected. unexpected is not used in the current C++ exception-handling implementation. The unexpected_function type is defined in EH.H as a pointer to a user-defined unexpected function, unexp_func, that returns void. Your custom unexp_func function should not return to its caller. typedef void ( *unexpected_function )( ); By default, unexpected calls terminate. You can change this default behavior by writing your own termination function and calling set_unexpected with the name of your function as its argument. unexpected calls the last function given as an argument to set_unexpected.
13 void terminate( void ); The terminate function is used with C++ exception handling and is called in the following cases: A matching catch handler cannot be found for a thrown C++ exception. An exception is thrown by a destructor function during stack unwind. The stack is corrupted after throwing an exception. terminate calls abort by default. You can change this default by writing your own termination function and calling set_terminate with the name of your function as its argument. terminate calls the last function given as an argument to set_terminate. terminate_function set_terminate( terminate_function term_func ); The set_terminate function installs term_func as the function called by terminate. set_terminate is used with C++ exception handling and may be called at any point in your program before the exception is thrown. terminate calls abort by default. You can change this default by writing your own termination function and calling set_terminate with the name of your function as its argument. terminate calls the last function given as an argument to set_terminate. After performing any desired cleanup tasks, term_func should exit the program. If it does not exit (if it returns to its caller), abort is called. The terminate_function type is defined in EH.H as a pointer to a user-defined termination function, term_func, that returns void. typedef void ( *terminate_function )( );
14 Aborts the current process and returns an error code. void abort( void ); Return Value abort does not return control to the calling process. By default, it terminates the current process and returns an exit code of 3. Remarks The abort routine prints the message "abnormal program termination"
15 Исключения в конструкторах и деструкторах Исключения позволяют сообщать об ошибках в конструкторах и деструкторах При ошибке в конструкторе вызываются деструкторы для всех элементов, созданных до ошибки class MyClass { public: class Size{ };// класс для исключения MyClass( int n) { if ( n > 1000 ) throw Size();...} // new Size(); }; try { MyClass * p = new MyClass( 2000); // } catch(MyClass::Size){ }
16 Иерархии исключений class Error; class IOError: public Error{}; class ReadError: public IError{}; class WriteError: public IError{}; class MathError: public Error{}; class OverFlowError: public MathError{}; class ZeroDivide: public MathError{};
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.