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