Программирование >>  Обработка исключительных ситуаций 

1 ... 26 27 28 [ 29 ] 30 31 32 ... 142


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

ПРИМЕЧАНИЕ-

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

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

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

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

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

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

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

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

catch ( OvertlowException е ) {

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

catch ( DivideByZeroExceptfon ) {

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

catch {

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

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



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

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

ПРИМЕЧАНИЕ-

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

Листинг 4.9. Использование исключений для проверки ввода using System;

namespace ConsoleApplicationi { class Program

static void MainO

string buf; double u, i, r;

Console.WriteLineC Введите напряжение: ); buf = Console.ReadLineO;

u = double.ParseC buf );

Console.WriteLineC Введите сопротивление: ): buf = Console.ReadLineO; r- = double. ParseC buf );

i = u / r;

Console.WriteLineC Сила тока

+ i );

catch ( FormatException )

catch

Console.WriteLineC Неверный формат ввода! );

общий случай Console.WriteLineC Неопознанное исключение );



Оператор throw

До сих пор мы рассматривали исключения, которые генерирует среда выполнения С#, но это может сделать и сам программист. Для генерации исключения используется оператор throw с параметром, определяющим вид исключения. Параметр должен быть объектом, порожденным от стандартного класса System.Exception. Этот объект используется для передачи информации об исключении его обработчику.

Оператор throw употребляется либо с параметром, либо без него: throw [ выражение ];

Форма без параметра применяется только внутри блока catch для повторной генерации исключения. Тип выражения, стоящего после throw, определяет тип исключения, например:

:hrow new DivideByZeroExceptionO;

Здесь после слова throw записано выражение, создающее объект стандартного класса ошибка при делении на 0 с помощью операции new.

При генерации исключения выполнение текущего блока прекращается и происходит поиск соответствующего обработчика с передачей ему управления. Обработчик считается найденным, если тип объекта, указанного после throw, либо тот же, что задан в параметре catch, либо является производным от него.

Рассмотрим пример, приведенный в спецификации С#:

jsing System; class Test

static void F() { try {

GO; функция, в которой мож произойти исключение

catch ( Exception е ) {

Console.WriteLineC Exception in F: + e.Message ); e = new Exception( F );

throw; повторная генерация исключения

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



1 ... 26 27 28 [ 29 ] 30 31 32 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика