Главная » C# » Реализация обработчиков исключений в Visual C# (Sharp)

0

Обработчик исключения реализуется с помощью ключевых слов try, catch и finally. Суть реализации обработчика исключения в том, что исключение, сгенерированное в определенном блоке кода, будет перехвачено и обработано. Блок обработчика исключения имеет такую структуру:

[действие 1]

try {

[действие 2]

}

catch (Exception exception) {

[действие 3]

}

[действие 4]

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

Если код в блоке try (действие 2 в примере) вызывает другой метод, то на код вызываемого  метода также  распространяется защита блока, даже если  код  вызы-

ваемого метода не защищен с точки зрения этого метода. На рис. 5.4 показан пресс перехвата и обработки исключений в такой ситуации.

Рис. 5.4. Перехват и обработка исключений при вызове метода защищенным блоком кода

Итак, защищенный блок кода в действии 1.2 вызывает метод, который имеет действие 2.1, действие 2.2 И действие 2.4. Действие 2.2 выполняетс я  В контекст е защищенного блока вызываемого метода, поэтому если оно сгенерирует исключие, то это исключение будет перехвачено и обработано действием 2.3. Блок catch вызывающего кода, содержащий действие 1.3, не будет знать о проиедшем исключении. С точки зрения вызываемого метода, действие 2. 1  и действие 2. 4 не являются защищенными, но т.к . данный метод вызывается из действия 1.2, которое Защищено блоком catch, содержащим действие 1.3, то действие 2 .1 и действие 2.4, по сути, защищены блоком catch вызывающего мода. Если действие 2 ..1 или действие 2.4 сгенерирует исключение, то это искление будет перехвачено и обработано блоком catch вызывающего метода.  Даый пример иллюстрирует следующее:

•    процесс перехвата и обработки исключений может охватывать несколько уроей вызовов методов;

•    сгенерированное исключение будет перехвачено как можно ближе к месту, где оно произошло.

Не все исключения обязательно  обрабатываются обработчиком высокого уровня; большинство из них перехватываются и обрабатываются обработчиками низкого уровня. Но иногда исключение с самого низкого уровня обрабатываются на самом высоком уровне, как показано на рис. 5.3, где исключение, сгенерированное на глубине нескольких вызовов, было перехвачено на самом высоком уровне.

В предыдущих примерах исключения вызывались неправильными действиями кода. Но исключение можно также сгенерировать преднамеренно с помощью следующей команды:

throw new Exception();

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

В большинстве случаев выбрасывания исключения экземпляр типа exception соается при выбрасывании. В предыдущем примере был использован конструктор Exception () без параметров, но имеются также и другие варианты конструктора:

try {

throw new Exception("Exception in action 2.4.");

catch  (Exception thrown) {

throw new Exception("Exception in action 2 has been caught. ", thrown);

}

В перво м вариант е конструктора — Exception("Exception in action 2.4 ) — ИС- пользуется строковый параметр, который передает текст, описывающий причины возникновения исключения. Это  описание должно быть  понятно  людям,  поэтому не используйте описаний типа "Ошибка 168: что-то не так". Второй вариант консуктора—Exception("Exception in action 2 has been caught.", thrown) — содержит   первоначальное   исключение   в   качестве  дополнительного   параметра в новом выброшенном исключении. Таким образом,  можно предоставить еще бее подробную информацию о причинах исключения.

Данный код генерирует вывод, подобный следующему:

Unhandled Exception: System.Exception: Exception in action 2  has been caught.

—> System.Exception: Exception in action 2.4 .

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

ПРИМЕЧАНИЕ

Опытный программист может заметить, что информацию о потоке выполнения прраммы также можно получить из дампа стека программы, и необязательно для этого выбрасывать исключения.  Хотя  в принципе это верно,  на  практике  расшифровка даа стека  10 или  15 вызовов методов доставляет мало удовольствия.

Теперь рассмотрим предыдущий код, модифицированный для предоставления уменьшенного объема информации:

try

{

throw new Exception("Exception in action 2.4.");

}

catch (Exception thrown)

{

throw new Exception("Exception in action 2 has been caught");

}

Предоставляемый этим кодом вывод не очень информативный:

Unhandled Exception:  System.Exception:  Exception in action 2 has been caught.

Доступ  к  тексту  сообщения  об  ошибке  можно  получить  с  помощью  свойства

Message исключения :

try {

throw new Exception("Exception in action 2.4.");

}

catch (Exception thrown)

{

Console.WriteLine(thrown.Message);

throw new Exception("Exception in action 2 has been caught.");

}

В результате будет выведено более специфичное сообщение, но не как часть пота исключений:

Exception in action 2.4.

Unhandled Exception: System.Exception: Exception in action 2 has been caught.

HE    ИСПОЛЬЗУЙТЕ    ПОВТОРЯЮЩИХСЯ     СООБЩЕНИЙ     ОБ     ОШИБКАХ

При выбрасывании исключений не следует употреблять одно и то же сообщение об ошибке дважды. Представьте себе ситуацию, когда’ разработанная вами программа постоянно сообщает клиенту, что "файл не найден". Если это сообщение выводится в нескольких ситуациях, то, когда  пользователь  позвонит в  службу технической  поддеи, ее персонал не будут знать, какой именно файл не был найден. Поэтому  в  сооении об ошибке необходимо указать,  какой  именно  файл  не  был  найден  и  почему. Чем больше подробностей об ошибке вы предоставите, тем легче будет персоналу технической  поддержки  помочь  пользователям  решить  проблему.

Если по каким-либо причинам  один  и  тот же  текст необходимо  использовать  в  раых местах, добавьте к нему идентификатор контекста. Например, сообщение об ошибке загрузки файла может выдаваться при загрузке файла  с помощью  графичкого диалогового окна или при загрузке из командной строки. Каждый из этих коекстов   следует   указать   с   помощью   дополнительной   информации,   добавленной к самому сообщению об ошибке загрузки файла, подобно тому, как было проиллтрировано в предыдущем  коде при  перехвате исключения  в действии 2.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии