Если в результате исполнения оператора в try-блоке возникает исключение, исполнение try-блока прекращается (т.е. он немедленно завершается).
Затем программа ищет первый catch-обработчик, который может обработать тип
возникшего исключения. Программа находит подходящий обработчик,
сравнивая тип выброшенного исключения с типом параметра исключения каждого
из catch-обработчиков, пока не обнаружит согласование. Согласование имеет
место, если типы либо идентичны, либо тип выброшенного прерывания
является производным классом от типа параметра исключения. При согласовании
исполняется код, содержащийся внутри catch-обработчика. Когда обработчик
завершается достижением его закрывающей фигурной скобки (}), исключение
считается обработанным и локальные переменные, определенные внутри
catch-обработчика (включая параметр исключения) выходят из области
действия. Программное управление не возвращается в точку, где исключение
возникло (т. н. точку выброса), поскольку try-блок прекращен. Вместо этого
|
|
управление переходит к первому оператору (строка 49) после последнего из
catch-обработчиков, следующих за try-блоком. Это называют завершающей
моделью управления исключениями. [Замечание. В некоторых языках
используется возобновляющая модель управления исключениями, в которой после
обработки исполнение возобновляется сразу за точкой выброса.] Как и в случае
любого другого блока, при завершении try-блока определенные в нем
локальные переменные выходят из области действия.
Если try-блок завершает свое исполнение успешно (т.е. никаких исключений в нем не происходит), программа пропускает catch-обработчики и управление переходит к первому оператору после последнего из catch-обработчиков, следующих за try-блоком. Другими словами, если исключений в try-блоке не происходит, программа игнорирует все его catch-обработчики.
Если для возникшего в try-блоке исключения не находится подходящего
обработчика, или если исключение возникает в операторе, не заключенном
в try-блок, функция, содержащая этот оператор, немедленно завершается,
и программа пытается найти охватывающий try-блок в вызывающей функции.
Этот процесс, обсуждаемый в разделе 16.8, называется разматыванием стека.
Поток управления в случае, когда пользователь вводит