Где выполнение возобновляется после исключения? - PullRequest
3 голосов
/ 25 декабря 2009

В общем, где возобновляется выполнение программы после того, как исключение было сгенерировано и перехвачено? Возобновляется ли он после строки кода, в которой было сгенерировано исключение, или он возобновляет выполнение после того, как оно было перехвачено? Кроме того, является ли это поведение согласованным в большинстве языков программирования?

Ответы [ 5 ]

7 голосов
/ 25 декабря 2009

Код внутри блока catch выполняется, и первоначальное выполнение продолжается сразу после блока catch.

3 голосов
/ 25 декабря 2009

выполнение возобновляется с того места, где перехвачено исключение, то есть в начале блока catch, в котором конкретно указан текущий тип исключения. блок catch выполняется, остальные блоки catch игнорируются (представьте множественный блок catch как оператор switch). на некоторых языках блок finally также может выполняться после catch. затем программа переходит к следующей инструкции, следующей за целыми try ... catch ... finally ....

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

если для исключения нет обработчика, программа обычно вылетает. (некоторые языки могут отличаться в этом отношении).

поведение потока выполнения одинаково для всех языков, которые я знаю. единственное отличие заключается в конструкции try ... catch ... finally ...: finally существует не на всех языках, некоторые языки не допускают finally и catch в одном и том же блоке (необходимо вставить два try в используйте 2), некоторые языки позволяют поймать все (catch (...) в C ++), в то время как некоторые языки этого не делают.

2 голосов
/ 25 декабря 2009

У меня нет под рукой моей копии Бьярна Страуструпа "Design & Evolution", но я думаю, что он написал там о некотором опыте с возобновляемыми исключениями. Они обнаружили, что значительно усложнили ситуацию, чтобы ее исправить. В конце концов, если в какой-то строке произошла непредвиденная ошибка, ваш обработчик исключений должен достаточно исправить проблему, чтобы возобновить выполнение, не зная контекста. Это может быть возможно для ошибки нехватки памяти (хотя такие ошибки часто являются результатом неконтролируемого выделения памяти, и добавление некоторой дополнительной памяти на самом деле ничего не исправит), но не для исключений в целом.

Итак, в C ++ и на всех языках, с которыми я знаком, выполнение возобновляется с перехватом и автоматически не возвращается к месту, которое вызвало исключение.

2 голосов
/ 25 декабря 2009

Выполнение продолжается в блоке перехвата (где было поймано исключение).
Это согласуется с языками, в которых используются исключения.

Важное замечание (особенно в C ++)
Между броском и точкой захвата стек разматывается упорядоченным образом, так что все объекты, созданные в стеке, корректно уничтожаются (в ожидаемом порядке). Это привело к технике, известной как RAII.

1 голос
/ 25 декабря 2009

Возобновляет, где ловится исключение. В противном случае, какой смысл писать исключение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...