Генерация исключений в конструкторах.Иерархия искл.в станд.библиотеке



Механизм обработки исключительных ситуаций очень удобен для обработки ошибок, возникающих в конструкторах. Так как конструктор не возвращает значения, то соответственно нельзя возвратить некий код ошибки и приходится искать альтернативу. В этом случае наилучшим решением является генерация и обработка исключительной ситуации. При генерации исключения внутри конструктора процесс создания объекта прекращается. Если к этому моменту были вызваны конструкторы базовых классов, то будет обеспечен и вызов соответствующих деструкторов. Рассмотрим на примере генерацию исключительной ситуации внутри конструктора. Пусть имеется класс В, производный от класса А и содержащий в качестве компоненты-данного объект класса local. В конструкторе класса В генерируется исключительная ситуация.

#include<iostream>

using namespace std;

class local

{ public:

local() { cout<<"Constructor of local"<<endl; }

~local() { cout<<"Destructor of local"<<endl; }

};

class A

{ public:

A() { cout<<"Constructor of A"<<endl; }

~A() { cout<<"Destructor of A"<<endl; }

};

class B: public A

{ public:

local ob;

B(int i)

{ cout<<"Constructor of B"<<endl;

if(i) throw 1;

}

~B() { cout<<"Destructor of B"<<endl; }

};

int main()

{ try {

B ob(1);

}

catch(int) {

cout<<"int exception handler";

}

return 0;

}

Результат выполнения программы:

Constructor of A

Constructor of local

Constructor of B

Destructor of local

Destructor of A

int exception handler

В программе при создании объекта производного класса В сначала вызываются конструкторы базового класса А, затем класса local, который является компонентом класса В. После этого вызывается конструктор класса В, в котором генерируется исключительная ситуация. Видно, что при этом для всех ранее созданных

объектов вызваны деструкторы, а для объекта самого класса В деструктор не вызывается, так как конструирование этого объекта не было завершено.

Если в конструкторах выполнялось динамическое выделение памяти, то

при генерации исключительной ситуации выделенная память автоматически освобождена не будет, об этом необходимо заботиться самостоятельно, иначе возникнет утечка памяти.

 

Вершиной иерархии является класс exceptioh (определенный в заголовоч-

ном файле <exception>). В этом классе содержится функция what(), переопределяемая в каждом производном классе для выдачи сообщения об ошибке. Непосредственными производными классами от класса exception являются классы runtime_error и logic_error (определенные в заголовочном файле <stdexcept>), имеющие по несколько производных классов.

Производными от exception также являются исключения: bad_alloc, гене-

рируемое оператором new, bad_cast, генерируемое dynamic_cast, и bad_typeid, генерируемое оператором typeid.

Класс logic_error и производные от него классы (invalid_argument,

length_error, out_of_range) указывают на логические ошибки (передача неправильного аргумента функции, выход за пределы массива или строки).

Класс runtime_error и производные от него (overflow_error и

underflow_error) указывают на математические ошибки переполнения сверху и снизу.

 

 


Дата добавления: 2015-12-21; просмотров: 48; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!