Традиционный подход состоит в том, чтобы ... ну ... а не:)
Обычно люди просто проверяют состояние после попытки чего-либо, и если что-то идет не так, они убираются и возвращают код ошибки, а не продолжают. Эта проверка и возврат ошибок распространяется обратно вниз по стеку вызовов функций, пока не вернется к высокому уровню в вашей программе, где вы будете информировать пользователя, а не просто возвращать больше ошибок:
int try_it() {
if (!do_something(...)) {
return TRYIT_FAILURE;
}
}
void my_gui() {
rc = try_it()
if (rc == TRYIT_FAILURE) {
message_box("failed when trying it.", MB_ABORT|MB_RETRY);
}
...
}
Вы также можете сделать это в большой функции, используя вложенные ifs, если вы хотите что-то вроде try ... кроме конструкции:
if (stage1()) {
if (stage2()) {
if(stage3()) {
printf("success!\n");
} else {
// error handling for stage 3
}
} else {
// error handling for stage 2
}
} else {
// error handling for stage 1
}
И вы можете сделать то же самое с gotos, если вы немного злитесь.
Однако вы можете делать реальные исключения, по крайней мере, в C. В C есть два стандартных вызова библиотеки для такого рода вещей: setjmp и longjmp. С их помощью вы можете перепрыгнуть через несколько вызовов функций в заранее определенное место, где вы знаете, что произошло исключение (прыжок). См. Setjmp.h # exception_handling в Википедии , чтобы узнать больше об этом.
Кажется, у Perl есть способ сделать это, хотя это выглядит далеко не интуитивно для меня. Опять же, я не кодирую в Perl:)
FAQ по Perl Q4.8