Оператор try

Оператор try содержит три части:

контролируемый блок - составной оператор, предваряемый ключевым сло­
вом try. В контролируемый блок включаются потенциально опасные операто­
ры программы. Все функции, прямо или косвенно вызываемые из блока, так­
же считаются ему принадлежащими;

□ один или несколько обработчиков исключений - блоков catch, в которых опи­
сывается, как обрабатываются ошибки различных типов;

блок завершения finally выполняется независимо от того, возникла ошибка
в контролируемом блоке или нет.

Синтаксис оператора try:

try блок [ блоки catch ] [ блок finally ]

Отсутствовать могут либо блоки catch, либо блок finally, но не оба одновре­менно. Рассмотрим, каким образом реализуется обработка исключительных ситуаций.

1. Обработка исключения начинается с появления ошибки. Функция или опе­
рация, в которой возникла ошибка, генерирует исключение. Как правило, ис­
ключение генерируется не непосредственно в блоке try, а в функциях, прямо
или косвенно в него вложенных.

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

3. Выполняется блок finally, если он присутствует (этот блок выполняется и в том
случае, если ошибка не возникла).

4. Если обработчик не найден, вызывается стандартный обработчик исключе­ния. Его действия зависят от конфигурации среды. Обычно он выводит на эк­ран окно с информацией об исключении и завершает текущий процесс.

Обработчики исключений должны располагаться непосредственно за блоком try. Они начинаются с ключевого слова catch, за которым в скобках следует тип об­рабатываемого исключения. Можно записать один или несколько обработчиков в соответствии с типами обрабатываемых исключений. Блоки catch просматри­ваются в том порядке, в котором они записаны, пока не будет найден соответст­вующий типу выброшенного исключения.

Синтаксис обработчиков напоминает определение функции с одним парамет­ром — типом исключения. Существуют три формы записи:

catch(тип имя) {.../* тело обработчика */ }
catch(тип) {.../* тело обработчика */ }
catch {... /* тело обработчика */ }

Первая форма применяется, когда имя параметра используется в теле обработ­чика для выполнения каких-либо действий, например вывода информации об исключении.

Вторая форма не предполагает использования информации об исключении, иг­рает роль только его тип.

Третья форма применяется для перехвата всех исключений. Так как обработ­чики просматриваются в том порядке, в котором они записаны, обработчик третьего типа (он может быть только один) следует помещать после всех осталь­ных. Пример:

try

{

//... // Контролируемый блок

}

catch (OverflowExceptione)

{

// Обработка исключений класса OverflowException (переполнение)

}

catch (DivideByZeroException)

{

//... // Обработка исключений класса DivideByZeroException (деление на 0)

}

catch

{

// Обработка всех остальных исключений

}

Если исключение в контролируемом блоке не возникло, все обработчики про­пускаются.

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

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


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



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