
polevoy_cpp_2012_spring_lecture_06
.pdf
Как перехватывать исключения
•по константной ссылке
–избегаем копирования объекта исключения
–избегаем усечения до родительского типа
–гарантируем постоянство объекта
исключения
•рекомендуется использовать для перехвата константные ссылки
17.03.2012 |
cppNewb.ru |
31 |

Перехват любых исключений
•список аргументов (…)
•следует размещать в конце списка перехватчиков
•невозможно получить информацию об исключении и его типе
17.03.2012 |
cppNewb.ru |
32 |

Перехват любых исключений (пример)
catch (const std::bad_alloc& ex)
{
// обработка
}
catch (...)
{
// обработка
}
17.03.2012 |
cppNewb.ru |
33 |

Перезапуск исключения
•передает исключение далее
•необходим, если текущий обработчик не может выполнить всю работу
•вызывается throw без аргумента внутри обработчика исключения
17.03.2012 |
cppNewb.ru |
34 |

Перезапуск исключения (пример)
catch (const CExept1& ex1)
{
// обработка throw;
}
catch (...)
{
// обработка throw;
}
17.03.2012 |
cppNewb.ru |
35 |

Исключение в деструкторе
•деструктор вызывается
–нормальный вызов
–при обработке исключения
•при обработке исключение не должно покинуть сам деструктор
17.03.2012 |
cppNewb.ru |
36 |

Неперехваченные исключения
•вызывается terminate()
•terminate() по умолчанию вызывает abort() из системной библиотеки
17.03.2012 |
cppNewb.ru |
37 |

Вызов terminate
•неперехваченное исключение
•исключение в деструкторе локального объекта в процессе раскрутки стека
•исключение в конструкторе или деструкторе глобального или статического объекта
17.03.2012 |
cppNewb.ru |
38 |

Спецификация исключений
•не рекомендуется использовать
•часть объявления функции
•список исключений, которые могут быть
сгенерированы функцией
пример:
void func(int a) throw(CEx1, CEx2);
17.03.2012 |
cppNewb.ru |
39 |

Стандартные исключения
•образуют иерархию классов
•объявлены в пространстве имен std
•объявлены в заголовочных файлах
–<stdexcept>, <new>, <exception>, <ios>, <typeinfo>
17.03.2012 |
cppNewb.ru |
40 |