Глава 22. Обработка исключительных ситуаций________________________587
// Нормальная деятельность
OverflowError:
cout « "Переполнение! \п";
Если в этом примере происходит переполнение, ясно, что реакция будет немедленной и категоричной. К сожалению, оператор goto имеет серьезное ограничение: его можно использовать только в пределах отдельной функции или метода. Посмотрите на листинг 22.4: вы, может быть, и рады были бы написать нечто подобное, но просто не можете этого сделать.
// Необходимые заголовки ^include <limits.h> ttinclude <iostream.h>
unsigned short Add(unsigned short addendl, unsigned short addend2)
« {
unsigned long sum = addendl + addend2;
if (sum > USHRT_MAX)
goto OverflowError; // Нельзя — выход за пределы Add() return (unsigned short) sum;
}
void main() (^
unsigned short Result = Add(12345, 54321);
cout « "Ответ равен " « Result « "\n";
return;
// Секция обработки ошибок — но вы никогда сюда не попадете OverflowError:
cout « "Переполнение!\п";
return;
}
С другой стороны, пара функций setjmp/longjmp может помочь вам справиться с этой проблемой. Листинг 22.5 показывает работоспособную версию предыдущей программы.
// Необходимые заголовки tinclude <limits.h> jtinclude <iostream.h> #include <setjmp.h>
jmp_buf jmp info;