Завершающая модель управления исключениями

Если в результате исполнения оператора в try-блоке возникает исключение, исполнение try-блока прекращается (т.е. он немедленно завершается).

Затем программа ищет первый catch-обработчик, который может обработать тип

возникшего исключения. Программа находит подходящий обработчик,

сравнивая тип выброшенного исключения с типом параметра исключения каждого

из catch-обработчиков, пока не обнаружит согласование. Согласование имеет

место, если типы либо идентичны, либо тип выброшенного прерывания

является производным классом от типа параметра исключения. При согласовании

исполняется код, содержащийся внутри catch-обработчика. Когда обработчик

завершается достижением его закрывающей фигурной скобки (}), исключение

считается обработанным и локальные переменные, определенные внутри

catch-обработчика (включая параметр исключения) выходят из области

действия. Программное управление не возвращается в точку, где исключение

возникло (т. н. точку выброса), поскольку try-блок прекращен. Вместо этого

управление переходит к первому оператору (строка 49) после последнего из

catch-обработчиков, следующих за try-блоком. Это называют завершающей

моделью управления исключениями. [Замечание. В некоторых языках

используется возобновляющая модель управления исключениями, в которой после

обработки исполнение возобновляется сразу за точкой выброса.] Как и в случае

любого другого блока, при завершении try-блока определенные в нем

локальные переменные выходят из области действия.

Если try-блок завершает свое исполнение успешно (т.е. никаких исключений в нем не происходит), программа пропускает catch-обработчики и управление переходит к первому оператору после последнего из catch-обработчиков, следующих за try-блоком. Другими словами, если исключений в try-блоке не происходит, программа игнорирует все его catch-обработчики.

Если для возникшего в try-блоке исключения не находится подходящего

обработчика, или если исключение возникает в операторе, не заключенном

в try-блок, функция, содержащая этот оператор, немедленно завершается,

и программа пытается найти охватывающий try-блок в вызывающей функции.

Этот процесс, обсуждаемый в разделе 16.8, называется разматыванием стека.

Поток управления в случае, когда пользователь вводит


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: