logo
шпоры по ООП

68.Обработчик исключений.

Поцедура обработки исключений определяется ключевым словом catch, вслед за которым в скобках помещена спецификация исключения, а затем в фигурных скобках следует блок обработки исключения. Эта процедура должна быть помещена непосредственно после контролируемого блока. Каждая процедура может обрабатывать только одно исключение заданного или преобразуемого к заданному типа, который указан в спецификации ее параметра. Рассмотрим возможные преобразова ния при отождествлении исключения с процедурой обработки исключений. Стандартная схема:

try { // Произвольный код, порождающий исключения X. }

catch (T х) { // Некоторые действия, возможно с х. }

Здесь определена процедура обработки для объекта типа T.

Если исключение X есть объект типа T, T&, const T или const T&, то процедура соответствует этому объекту X. Кроме того, соответствие между исключением X и процедурой обработки устанавливается в тех случаях, когда Tи X - одного типа; T -доступный в точке порождения исключения базовый класс для X; T -тип "указатель" и X - типа "указатель", причем X можно преобразовать к типу T путем стандартных преобразований указателя в точке порождения исключения.

Просмотр процедур обработки исключений производится в соответствии с порядком их размещения в программе. Исключение обрабатывается некоторой процедурой в случае, если его тип совпадает или может быть преобразован к типу, обозначенному в спецификации исключения. При этом необходимо обратить внимание, что если один класс (например, ALPHA) является базовым для другого класса (например, BETA), то обработчик исключения BETA должен размещаться раньше обработчика ALPHA. В противном случае обработчик исключения BETA не будет вызван никогда.

class ALPHA();

class BETA: public ALPHA {} ; ……….

void f1()

{

try { ... }

catch (BETA) // Правильно.

{ ... }

catch (ALPHA)

{ ... } . . . . } . . . .

void f2() { ...

try { ... }

catch (ALPHA) // Всегда будет обработан и объект класса

{ ... // BETA, т.к. "захватываются" исключения

... } // классов ALPHA и всех порожденных от него.

catch (BETA) // Неправильно: заход в обработчик невозможен!

{ ... } . . . .

}