Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

polevoy_cpp_2012_spring_lecture_06

.pdf
Скачиваний:
7
Добавлен:
20.04.2015
Размер:
124.44 Кб
Скачать

Запуск исключений (пример)

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