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

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


348 Самоучитель , С++

II Этой функцией могут возбуждаться только

исключительные ситуации типов int, char и double void Xhandler (int test) throvj(int, char, double)

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

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

уадение исключительное ации типа double if (te3t=2) throw 123.23;

cout начало\п ;

try {

Xhandler(0); попробуйте также передать в

функции м:ег О значения i и 2

catch (int i) {

cout Перехват int\n ;

>

catch (char c) j

cou Перехват char\n ;

catch (doubled) {

cout Перехват double\n ;

cout << конец ; ,. ,

return 0;

В этой программе функция может возбуждать только исключи-

тельные ситуации типа int, char и double. При попытке возбудить исключительную ситуацию другого типа произойдет аварийное завершение программы. (То есть будет вызвана функция unexpected<).) Чтобы убедиться в этом, удалите из списка допустимых исключительных ситуаций тип int и повторите запуск программы.

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



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

только внутри блока catch (или любой функцией, которая вызывается из

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

/* Прер повторного возбуждения исключительной ситуации одного и

того же типа

ttinclude <iostreain>

using namespace std;

void Xhandler () {

try {

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

..... I- . . . 1 ;

перехват исключительной ситуации типа char * . .

catch (char *) { . ..

cou Перехват char * внутри функции Xhandler ()\n ;

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

типа char *, но теперь уже не в функции Xhandler О :

throw;

} . .

4. Следующее небольшое изменение в функции ш(Нег() запрещает возбуждение любой исключительной ситуации:

Эта функция НЕ может вызывать никаких исключительных ситуаций

void Xhandler(int test) throw ()

/*Следующие инструкции больше не работают. Наоборот, попытка их выполнения ведет к ненормальному завершению программы

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

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

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




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

2. Что неправильно в данном фрагменте? try {

throw 10;

} .

catch (int *p) { /7 , , ,

3. Предложите способ исправления предыдущего фрагмента.

4. Какая инструкция catch перехватывает все типы исключительных ситуаций?

5. Далее представлен каркас функции divide().

double (double a, double b) --

добавьте обработку ошибок return a/b;

int mainO -г-. чТ-

\ .. . . -и;- н

cout начало\п ; ,

try { . .

XhandlerO;

> .

catch(char *) {

cout Перехват char * внутри функции main()\n ;

cou конец ; . .

return 0; -.[

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

Перехват char * внутри функции XhandlerO . - ... . - у

Перехват char * внутри функции main() .... , и ,.

конец



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

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