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

1 ... 110 111 112 [ 113 ] 114 115 116 ... 227


Глав h Шаблоны и обработка итель ных ситуаций 345 Здесь многоточие соответствует любому типу данных.

Для функции, вызываемой из блока try, вы можете ограничить число типов

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

Фактически можно даже запретить функции вообще возбуждать какую бы то ни бгло исключительную ситуацию. Для этого необходимо добавить в определение функции ключевое слово throw. Здесь представлена основная форма такого определения:

возвраща9Ю1а тгт ямяфункцих (спхсох аргументов) throw ( спясок !гипоп) {

fl ...

Здесь в поле перечисляются через запятые только те типы

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

Если ваш компилятор работает в соответствии с современнгм стандартом Standard С то попытка возбуждения неподдерживаемой исключительной ситуации приведет к вызову стандартной библиотечной функции un€xpected(). По умолчанию функция unexpected() вызывает функцию abort(), что ведет к аварийному ению программы. Однако при желании вы можете задать

собственную процедуру завершения программы. За подробностями обращайтесь к справочной документации вашего компилятора.

Если вы хотите в процедуре обработки исключительной ситуации возбудить повторную исключительную ситуацию, можно просто использовать инструкцию throw без параметров. Это приводит к тому, что текущая исключительная ситуация передается внешней последовательности инструкций try/catch.

Примеры

1. В следующей программе иллюстрируется использование инструкции Catch(...):

В этой программе перехватываются все тип ите ль ных ситуаций ttincluae <j.o5u.[:eain>

using namespace std; - i ,

voi er(int test) , --

try {

возбуждение исключительной ситуации типа int if(test=0) throw test;



возбуждение исключительной ситуации типа char > .

. . if(test=l) throw а;

возбуждение исключительной ситуации типа double

if (te3t==2) throw 123.23;

catc , ,) { перехват исключительных ситуаций всех типов cout Перехвачена ошибка! \n ;

cout начало\п ;

Xhandler (0) ; ... - л -

Xhandler (1); C. *.

Xhandler (2); : .( -,. ,

cout конец .\ , .

return 0;

У . . г.. , <

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

начало

Перехвачена .-шибка! , - , , la-.- . ..V -

Перехвачена ошибка! : -

Перехвачена ошибка! - J:. С-

конец

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

2. Очень удобно инструкцию catch(...) использовать в качестве последней в группе инструкций catch. В этом случае инструкция catch(.,.) по умолчанию становится инструкцией, которая перехватывает все . Например, далее представлена слегка измененная версия предыдущей программы, где исьспючительные ситуации целого типа перехватываются явно, а все другие - с помощью инструкции catch(...):

/* примере инструкция catch (...) по умолчанию перехватывает

все типы исключительных ситуаций

tinclude <iostream> using namespace std;

voi er(int test)

(



Глав 1 Г. Шаблоны и обработка чигельных ситуаций 347

t су {........ -

возбуждение исключительной ситуации типа int if (test=0) throw test; ,

возбуждение исключительной ситуации типа char

t=-l) throw возбуждение исключительной ситуации типа double if (test==2) throw 123.23;

catch(int i) { перехват исключительной ситуации типа int cout Перехвачен 1 \n;

catc . . ) { перехват исключительных ситуаций остальных типов cout << Перехвачена ошибка! \п ; .

int main {)

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

Xhandler(0); Xhandler(1); Xhandler(2);

cout конец ;

return 0; - .

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

начало

Перехвачен О

Перехвачена ошибка!

Перехвачена ошибка!

конец

Как показано в этом примере, использование инструкции таким

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

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

/* Ограничение числ здаемых функцией типов исключительных ситуаций

V . , - . . .

ttinclude <iostream> j,.- , i

using namespace std; .. n, t . . Ф r.i



1 ... 110 111 112 [ 113 ] 114 115 116 ... 227

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