НГТУ, каф. ВТ Исключения в С++ Макаревич Л. Г.. Что такое исключение Исключение или исключительная ситуация – возникновение непредвиденных или аварийных.

Презентация:



Advertisements
Похожие презентации
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Advertisements

Лекция 3. Введение в C++ Примеры взяты из книги Брюса Эккеля Думаем на С++
24. Обработка исключений Основные вопросы Понятие исключительной ситуации. Проблемы при описании и обработке исключительных ситуаций обычными.
Лекция 27. Введение в STL (часть 4) Красс Александр СПбГУ ИТМО, 2009.
1 Обработка исключений в Java Одно из важнейших преимуществ Java – разработанный на уровне языка механизм обработки исключений. Исключение в Java - это.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Обработка исключений Основы метапрограммированияОбработка исключений Основы метапрограммирования.
С++, ООП Семинар 2 Рябова Анна Сергеевна
C++ Объектно-ориентированное программирование. Первая программа C++ #include int n = 5; // глобальная переменная void main() {int n; // локальная переменная.
Saint Petersburg, 2011 Java Lecture #06 Exceptions.
Октябрь Обработка исключений. Октябрь Основные вопросы Понятие исключительной ситуации. Понятие исключительной ситуации. Проблемы при описании.
Объектно-ориентированное программирование С++. Лекция 9 Карпов В.Э.
Обработка исключительных ситуаций. Синтаксис try{ операторы0; } catch (ТипИсключения1 переменная1){ операторы1; } catch (ТипИсключения2 переменная2){
Обработка исключений Исключения (exceptions) - это неожиданные ситуации, возникающие при выполнении программы Типичные ситуации это "деление на нуль",
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Исключения в Java. Исключения – это механизм взаимодействия между кодом, приведшим к ошибке, и кодом, обрабатывающим ошибку Исключение выбрасывается (throw),
НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Программирование Часть 8 Обработка исключений.
Язык C++ Лекция 2. Недостатки enumов Засорение namespaceа, в котором находится enum Соответственно, члены enumа должны иметь уникальный префикс.
Транксрипт:

НГТУ, каф. ВТ Исключения в С++ Макаревич Л. Г.

Что такое исключение Исключение или исключительная ситуация – возникновение непредвиденных или аварийных событий при выполнении программы Исключения позволяют отделить программно обнаружение ошибки и ее обработку int fact (int n) { int f; if (n == 0) return 1; if ( n >0 ) { int k = n-1; return n*fact(k); } А если ошибка в конструкторе? А если при ошибке надо делать разные действия в разных случаях?

Механизм обработки исключений Появление ошибки Генерация исключения – throw Отыскивается обработчик исключения и управление передается ему Если обработчика нет, то вызывается функция terminate, которая вызывает abort, аварийно завершающую процесс

Синтаксис исключений Контроль исключений try {... //Тело контролируемого блока // в теле блока могут вызываться другие функции, а из них – //другие. //Все функции, вызываемые из блока прямо или косвенно, //принадлежат этому блоку } Генерация исключений throw выражение; // Тип выражения определяет тип исключения // Обычно исключение генерируется в функциях // контролируемого блока Обработчики исключений catch( тип имя){/* тело обработчика*/} catch( тип){/* тело обработчика*/} catch( …){/* тело обработчика*/}

Пример 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

Перехват исключений Создается копия параметра throw в виде статического объекта Идет раскрутка стека с вызовом деструкторов всех локальных объектов Передается объект и управление подходящему обработчику Все обработчики просматриваются последовательно при раскрутке стека на каждом уровне Обработчик найден, если тип объекта, указанный в throw: Тот же, что и в catch ( T, const T, T&, const T& ) Является производным от указанного в catch Является указателем, который может быть преобразован к типу указателя в catch

class Hello { public: Hello(){ cout i; if ( i < 0 ) throw "Error!\n"; i = i + 99; } void f2() { Hello h; f1(); cout

Выводы Механизм исключений позволяет корректно уничтожать объекты Выделение и освобождение ресурсов удобнее делать в виде классов, причем выделяет ресурс конструктор, а корректно освобождает его – деструктор Класс для исключения можно определить как внутренний класс с конструктором копирования public Для создания копии объекта

Список исключений функции void f1() throw ( int, char *){ тело функции } void f1() throw (MyExcept *){ тело функции } void f1() throw (){ тело функции } //нет исключений void f1(){ тело функции } //любые исключения

Алгоритм обработки исключений Исключение Непредусмотренное исключение Обработка исключения Нет Да Unexpected() set_unexpected() Да Собственная функция Нет terminate() set_terminated() Да Собственная функция Нет abort()

Исключения при работе с динамической памятью #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 );

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.

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 )( );

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"

Исключения в конструкторах и деструкторах Исключения позволяют сообщать об ошибках в конструкторах и деструкторах При ошибке в конструкторе вызываются деструкторы для всех элементов, созданных до ошибки class MyClass { public: class Size{ };// класс для исключения MyClass( int n) { if ( n > 1000 ) throw Size();...} // new Size(); }; try { MyClass * p = new MyClass( 2000); // } catch(MyClass::Size){ }

Иерархии исключений 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{};