
polevoy_cpp_2012_spring_lecture_06
.pdf
Запуск исключений (пример)
if (0 == pData)
{
throw CNullPointer();
}
или
if (0 == pData)
{
throw ERR_DATA; // не лучший
}
17.03.2012 |
cppNewb.ru |
21 |

Локализация блоков с исключениями
•try-блок – составная инструкция, при выполнении которой могут генерироваться исключения
•try-блок сопровождается одним или несколькими блоками обработки исключений (catch-блоки)
17.03.2012 |
cppNewb.ru |
22 |

Обработка исключений
•обработчик исключений
–осуществляет перехват и обработку исключений
–располагается сразу после блока try
–начинается с ключевого слова catch
•может использовать “пойманное” исключение и извлекать из него информацию
17.03.2012 |
cppNewb.ru |
23 |

Обработка исключений (пример)
try
{
// код, который может генерировать исключения
}
catch (Type1 exept)
{
// обработка исключений типа Type1
}
catch (Type2 exept)
{
// обработка исключений типа Type2
}
// нормальное выполнение программы...
17.03.2012 |
cppNewb.ru |
24 |

Раскрутка стека
•просмотр стека и поиск подходящего обработчика для исключения
•по мере раскрутки стека автоматически уничтожаются локальные объекты
•порядок разрушения обратный порядку создания (стек программы)
17.03.2012 |
cppNewb.ru |
25 |

Когда объект создан?
•объект считается созданным после завершения работы конструктора
•составной объект считается созданным после создания всех входящих в него объектов
•массив считается созданным после создания всех его элементов
17.03.2012 |
cppNewb.ru |
26 |

Автоматическое разрушение
•в процессе раскрутки стека производится только для созданных
•в массиве только для тех элементов массива, которые были созданы
17.03.2012 |
cppNewb.ru |
27 |

Поиск подходящего обработчика
•просматриваются “ближайшие” обработчики в порядке их следования в исходном коде
•объект (ссылка на объект) исключения производного класса перехватывается обработчиком базового класса
•при запуске указателя поиск идет по стандартным правила преобразований указателей
17.03.2012 |
cppNewb.ru |
28 |

Перехват исключения (пример)
class CExep1 {}; |
try |
class CExep2 |
{ |
: public CExept1 |
f(); |
{ |
} |
public: |
catch (const CExept2&) |
CExep2(const |
{ |
CExept1&); |
… |
}; |
} |
void f() |
catch (const CExept1&) |
{ |
{ |
throw CExept1(); |
… |
} |
} |
17.03.2012 |
cppNewb.ru |
29 |

Преобразования исключений
•обработчик объекта базового типа “усекает” исключение производного типа до базового
•автоматические преобразования одного типа исключений к другому не производятся
17.03.2012 |
cppNewb.ru |
30 |