585________________________________Часть IV. Новые возможности C++

unsigned short Add(unsigned short addendl, unsigned short addend2) {

unsigned long sum ^ addendl + addend2;

if (sum > USHRT_MAX)

longjmptjmp info, -1);

return (unsigned short) sum;

i

void main () {

int ErrorCode = setjmp (jmp_info) ;

if ('ErrorCode == 0) (

unsigned short Result = Add(12345, 54321);

cout « "Ответ равен " « Result « "\n";

return;

}

// Секция обработки ошибок

else {

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

}

}

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

К сожалению, стратегия использования функций setjmp/iongjmp страдает фатальным недостатком: в ней не учтен C++. Этот недостаток может показаться не слишком значительным, но подумайте, что должно случиться во фрагменте, приведенном в листинге 22.6.

void MyUsefulFunc() {

MyMemoryHogClass Hog;

// Некая деятельность...

if (Some error condition) longjmp(jmp info, — 1);

// Дальнейшая деятельность...