Глава 22. Обработка исключительных ситуаций________________________587

// Нормальная деятельность

OverflowError:

cout « "Переполнение! \п";

Если в этом примере происходит переполнение, ясно, что реакция будет немедленной и категоричной. К сожалению, оператор goto имеет серьезное ограничение: его можно использовать только в пределах отдельной функции или метода. Посмотрите на листинг 22.4: вы, может быть, и рады были бы написать нечто подобное, но просто не можете этого сделать.

h05871.jpg

// Необходимые заголовки ^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 показывает работоспособную версию предыдущей программы.

h05872.jpg

// Необходимые заголовки tinclude <limits.h> jtinclude <iostream.h> #include <setjmp.h>

jmp_buf jmp info;