Программирование >>  Расширенная версия языка c++ 

1 ... 108 109 110 [ 111 ] 112 113 114 ... 227


1. В следующем очень простом примере показано, как в C++ функционирует система обработки исключительных ситуаций:

Простой пример обработки исключительной ситуации

ttinclude<iostream>

using namespace std;

int main {) i

cout начало\п ;

try { начало блока try

cou Внутри блока throw 10; возбуждение ошибки cou Эта инструкция выполнена не будет ;

}

catch (in i) { перехват обки

cou перехвачена ошибка номер: ; cout 1 \п ;

cout конец ;

return 0;

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

Далее представлена основная форма инструкции throw: throw ясхлшмнтат.ная сятуацкя;

Инструкция throw должна выполняться либо внутри блоку, либо в любой функции, которую этот блок вызывает (прямо или косвенно). Здесь искяючитеАъиая ситуацая- это возбуждаемая инструкцией throw исключительная ситуация.

Если вы возбуждаете исключительную ситуацию, для которой нет соответствующей инструкции catch, может произойти ненормальное завершение программы. Если ваш компилятор функционирует в соответствии со стандартом Standard C++, то возбуждение необрабатываемой исключительной ситуации приводит к вызову стандартной библиотечной функции terminate(). По умолчанию для завершения программы функция вызывает функцию abort(), однако при желании можно задать собственную процедуру завершения программы. За подробностями обращайтесь к справочной документации

вашего компилятора.



Самоучитель

После выполнения программы на экран будет выведено следующее: начало .

Внутри блока try ,

Перехвачена ошибка номер: 10 , -> -i: . -и- .

конец

Внимательно изучите программу. Ка дадите, здесь имеется блок try, содержащий три инструкции, и инструкция catch (int i), обрабатывающая исключительную ситуацию целого типа. Внутри блока try будут выполнены только две из трех инструкций - инструкции cout и throw. После того как исключительная ситуация возбуждена, управление передается выражению catch и выполнение блока try завершается. Таким образом, инструкция catch вызывается не явно, управление выполнением программы просто передается этой инструкции. (Для этого стек автоматически сбрасывается.) Следовательно, следующая за инструкцией throw инструкция cout не будет выполнена никогда.-

После выполнения инструкции catch, управление программы передается следующей за ней инструкции. Тем не менее, обьино блок catch заканчивают вызовом функции exitO, abort() или какой-либо другой функции, принудительно завершающей программу, поскольку, как правило, система обработки исключительных ситуаций предназначена для обработки катастрофических ошибок.

2. Как уже тип исключительной ситуации должен соответствовать

типу, заданному в инструкции catch. Например, в предыдущем примере, если изменить тип данных в инструкции catch Ыс, то исключительная ситуация не будет перехвачена и будет иметь место ненормальное завершение программы. Это продемонстрировано в следующем фрагменте:

Этот пример работать не будет

#iftclude <iostream> > : ггУ:-

using namespace std; nii - . .

int main ()

cout << начало\п ;

try { начало блока try

cout Внутри блока try\n ; с

throw 10; возбуждение ошибки

cou Эта инструкция волнена не будет ;

catch (double i) { Эта инструкция не будет работать

с исключительной ситуацией целого типа cou ехвачена ошибка номер: ; cou i \n ;

cout конец ; return 0;



На экран программа выводит следующее:

начало , ,

Внутри блока try

Внутри функции Xtest, test равно: О - i .

Внутри функции Xtest, test равно: 1 ,

Поскольку исключительная ситуация целого типа не будет перехвачена инст-руьщией catch типа double, на экран программа выведет следующее:

начало

Внутри блока try : liSii: - ч

Abnormal program termination *

3. Исключительная ситуация может быть возбуждена не входящей в блок try инструкцией, если сама эта инструьщия входит в функцию, которая вызывается из блока try. Например, ниже представлена совершенно правильная программа:

/* Возбуждение исключительной ситуации из функции, находящейся вне блока try

ttinclude <io3treaiT

using namespace std; . .

voi t(int test) -

cout Внутри функции Xtest, test равно: test \n ; if (test) throw test; . .

int main 0

I

cout

try { начало блока try

cou << Внутри блока try\n ; Xtest (0) Xtest (1)

Xtest

catch (int i) { перехват ошибки

cou ехвачена ошибка номер:

cout i

cou << конец ; return 0;



1 ... 108 109 110 [ 111 ] 112 113 114 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика