Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Блок catch




Блок catch содержит код, который должен выполняться при возникновении исключения. У блока try может быть несколько или ни одного связанного с ним блока catch. Если код из блока try не вызывает исключение, CLR никогда не исполнит код из соответствующих блоков catch. Поток пропускает все эти блоки и начинает исполнять код блока finally. Исполнив код блока finally, поток переходит к оператору, следующему за этим блоком.

Выражение, расположенное в скобках после ключевого слова catch, называют типом исключения (catch type). В Сопрограммах тип исключения должен содержать тип SystemException или его потомок. Так, показанный выше код содержит блоки catch, обрабатывающие исключения типа InvalidOperationException (и его производные), lOException (и его производные). Последний блок catch (в нем тип исключения не указан) обрабатывает любые другие исключения; такой блок равносилен блоку catch с типом исключения SystemException, если только нельзя получить доступ об исключении из кода, расположенного в блоке catch.

CLR просматривает блоки catch сверху вниз, поэтому «узкоспециализированные» исключения надо размещать выше.

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

Обнаружив фильтр блока, способного обработать исключение, CLR исполняет все внутренние блоки finally. Первым исполняется тот, что связан с блоком try, в котором возникло исключение, а последним — блок catch, тип которого соответствует исключению. Заметьте: ни один блок finally, связанный с блоками catch, не исполняется, пока не завершено исполнение кода из блока catch, обрабатывающего исключение.

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

■ сгенерировать то же исключение повторно, чтобы уведомить о нем код, расположенный выше по стеку вызовов;

■ сгенерировать исключение другого типа, чтобы передать коду, расположенному выше по стеку вызовов, больше сведений об исключении;

■ позволить потоку покинуть блок catch.

Если выбран первый или второй вариант, генерируется исключение и CLR действует как обычно: просматривает стек вызовов в поисках блока catch, тип которого соответствует сгенерированному исключению.

Если выбран последний вариант, поток выходит из блока catch и тут же переходит к исполнению кода из блока finally, если таковой есть. После исполнения блока finally поток покидает этот блок и переходит к выполнению оператора, расположенного сразу после блока finally. Если блока finally нет, поток переходит к исполнению оператора, стоящего за последним блоком catch.

В С# после типа перехвата можно указать имя переменной. При перехвате исключения эта переменная ссылается на сгенерированный объект, потомок SystemException. В коде блока catch ее можно использовать для получения информации об исключении (в частности, трассировочного следа в стеке вплоть до исключения).

 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 59; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты