Составители:
Рубрика:
{
...// Обработка исключений типа const char*
}
catch(Overflow)
{
... // Обработка исключений класса Overflow
}
catch(j)
{
... // Обработка всех необслуженных исключений
}
После обработки исключения управление передается первому оператору, находя-
щемуся непосредственно за обработчиками исключений. Туда же, минуя код всех обра-
ботчиков, передается управление, если исключение в try-блоке не было сгенерировано.
Когда с помощью throw генерируется исключение, функции исполнительной биб-
лиотеки C++ выполняют следующие действия:
1)
создают копию параметра throw в виде статического объекта, который существует до
тех пор, пока исключение не будет обработано;
2)
в поисках подходящего обработчика раскручивают стек, вызывая деструкторы ло-
кальных объектов, выходящих из области действия;
3)
передают объект и управление обработчику, имеющему параметр, совместимый по
типу с этим объектом.
Обработчик считается найденным, если тип объекта, указанного после throw:
• тот же, что и указанный в параметре catch (параметр может быть записан в форме Т,
const Т, Т& или const T&. где Т - тип исключения);
• является производным от указанного в параметре catch (если наследование произво-
дилось с ключом доступа public);
• является указателем, который может быть преобразован по стандартным правилам
преобразования указателей к типу указателя в параметре catch.
Из вышеизложенного следует, что обработчики производных классов следует раз-
мещать до обработчиков базовых, поскольку в противном случае им никогда не будет
передано управление. Обработчик указателя типа void автоматически скрывает указа-
тель любого другого типа, поэтому его также следует размещать после обработчиков
указателей конкретного типа.
Рассмотрим пример на использование обработчиков исключений. В данном приме-
ре используется класс Name, который рассматривался в примерах и ранее. Для срабаты-
вания механизма исключений - "ошибка выделения памяти" попытаемя выделить память
для полей класса очень большого размера. В результате исполнения на экран будет вы-
веден следующий текст:
Программа использующая классы
Входим в try - блок
Вызван обработчик исключений,
исключение - Ошибка выделения памяти для поля Фамилия
#include <iostream.h>
//Запрашиваем очень много памяти, чтобы ее невозможно было выделить
#define size1 1000000000000
#define size2 1000000000000
class Name
{
106
{ ...// Обработка исключений типа const char* } catch(Overflow) { ... // Обработка исключений класса Overflow } catch(j) { ... // Обработка всех необслуженных исключений } После обработки исключения управление передается первому оператору, находя- щемуся непосредственно за обработчиками исключений. Туда же, минуя код всех обра- ботчиков, передается управление, если исключение в try-блоке не было сгенерировано. Когда с помощью throw генерируется исключение, функции исполнительной биб- лиотеки C++ выполняют следующие действия: 1) создают копию параметра throw в виде статического объекта, который существует до тех пор, пока исключение не будет обработано; 2) в поисках подходящего обработчика раскручивают стек, вызывая деструкторы ло- кальных объектов, выходящих из области действия; 3) передают объект и управление обработчику, имеющему параметр, совместимый по типу с этим объектом. Обработчик считается найденным, если тип объекта, указанного после throw: • тот же, что и указанный в параметре catch (параметр может быть записан в форме Т, const Т, Т& или const T&. где Т - тип исключения); • является производным от указанного в параметре catch (если наследование произво- дилось с ключом доступа public); • является указателем, который может быть преобразован по стандартным правилам преобразования указателей к типу указателя в параметре catch. Из вышеизложенного следует, что обработчики производных классов следует раз- мещать до обработчиков базовых, поскольку в противном случае им никогда не будет передано управление. Обработчик указателя типа void автоматически скрывает указа- тель любого другого типа, поэтому его также следует размещать после обработчиков указателей конкретного типа. Рассмотрим пример на использование обработчиков исключений. В данном приме- ре используется класс Name, который рассматривался в примерах и ранее. Для срабаты- вания механизма исключений - "ошибка выделения памяти" попытаемя выделить память для полей класса очень большого размера. В результате исполнения на экран будет вы- веден следующий текст: Программа использующая классы Входим в try - блок Вызван обработчик исключений, исключение - Ошибка выделения памяти для поля Фамилия #include//Запрашиваем очень много памяти, чтобы ее невозможно было выделить #define size1 1000000000000 #define size2 1000000000000 class Name { 106
Страницы
- « первая
- ‹ предыдущая
- …
- 104
- 105
- 106
- 107
- 108
- …
- следующая ›
- последняя »