Программирование на языке высокого уровня. Марапулец Ю.В. - 106 стр.

UptoLike

Составители: 

{
...// Обработка исключений типа 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