Главная » C# » Перехват исключений в Visual C# (Sharp)

0

На рис. 2.13 показано, как среда Visual С# Express прервала поток исполнения прраммы, перехватив исключение, сгенерированное  арифметическим  переполненм. Это подобно ситуации, когда на уроке практического вождения инструктор пехватывает управление от ученика, чтобы избежать аварийной ситуации, предпосылки к которой были созданы неправильными действиями ученика. Побным образом, механизм среды CLR для перехвата и обработки исключений можно рассматривать как перехват инструктором управления, чтобы избежать оицательных последствий на исполнении операционной системы и других прилений, которые может вызвать неадекватное поведение какого-либо приложения.

В зависимости от конкретной внештатной ситуации перехват инструктором управлия может заключаться в торможении, выворачивании руля, устном указании и т. п.

То же самое происходит и при перехвате исключений — последующие действия могут иметь разный характер. В примере на рис. 2.13  перехват был выполнен срой IDE, которая предоставила дружественный, легко понимаемый интерфейс для дальнейшей обработки исключения.

Теперь взглянем на пример исходного кода, генерирующего исключение (рис. 5.2). На техническом жаргоне это называется выбрасыванием исключения (throwing an exception).

Рис. 5.2. Выбрасывание исключения

Если выполнить метод RunAHO, то Visual С# Express сгенерирует  исключение (рис. 5.3).

Рис. 5.3. Исключение, вызванное обращением к null-данным

Но это исключение не вызовет сбоя ни Visual С# Express, ни операционной систы, т. к. оно было перехвачено обработчиком исключений, встроенным в Visual Studio. Возвращаясь к аналогии с инструктором вождения, Visual Studio перехвата управление и вывела из нормального потока исполнения только программу, соавшую аварийную ситуацию.

Теперь представим себе, что эта программа исполняется сама по себе, а не в Visual Studio. В этом случае сгенерированное исключение заставит программу останиться на полном бегу, выведя на экран пространственное сообщение об ошибке, перечисляющее ссылки на объекты, строки кода и стек. Большинство пользоватей ничего не поняло бы, что произошло, и было бы вынуждено прекратить работу с программой.

Чтобы избежать такого развития событий, необходимо в исходный код программы вставить средство для перехвата исключения, как это сделала Visual Studio. Нример, если-имеются основания полагать, что исключение может быть сгенерирано в методе RunAii (), то код можно модифицировать таким образом:

class МуТуре {

public int DataMember;

}

class Tests {

public void GeneratesException() { MyType els = null; cls.DataMember = 10;

public void RunAllO {

try {

GeneratesException();

}

catch (Exception) {

}

}

}

Код, выделенный жирным шрифтом, называется блоком исключения. Этот код пехватывает исключение и предоставляет средства для его обработки. В этом прере после перехвата исключения ничего не происходит. При ее исполнении Visual С# Express не сгенерирует сообщения об исключении, и программа исполнится без проблем. С точки зрения Visual С# Express с программой все в порядке.

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

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

ПРИМЕЧАНИЕ

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

Примером реальной ситуации, в которой необходимо выбросить исключение, мет быть недействительный параметр. Как будет рассмотрено в разд.  "Фильтрация исключений" далее  в  этой главе,  для  таких  случаев  имеется  специальный  тип  илючения— Argumen t Except ion о. Разработчики, получив это исключение, могут потом с легкостью вычислить, что им необходимо исправить параметр. Это позвит им сэкономить время на отладке и сократить общее время разработки.

Реальная  работа  в  обработке  исключений  состоит во  вставке  кода для  перехвата и обработки всех возможных исключений. Но что лучше, потерять несколько часов в поисках причины ошибки или потратить несколько минут на вставку кода, котый поможет найти потенциальную ошибку без особых трудностей? Вопрос ритический, т. к., в общем, добавление кода для указания причин ошибки сэкономит вам время и сбережет нервы.

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

По теме:

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