Перехват исключения
Если вернуться к главе 2, "Типы и значения чисел .NET", и рассмотреть рис. 2.13, то можно вспомнить, как среда разработки Visual C# Express прерывает поток выполне¬ния программы в случае, когда математические операции приводили к переполнению и передаче исключения.
Это подобно тому, как пилот-инструктор прерывает действия курсанта, если он де¬лает серьезную ошибку в пилотировании, и берет на себя управление самолетом, чтобы избежать аварийной ситуации. Так, в некотором смысле можно рассматривать меха¬низм обработки исключений CLR как прием инструктором управления на себя, когда что-то пошло не так и курсант не справился.
При передаче исключения программа (подобно курсанту) должна быть способна к восстановлению управления. То, как вы справляетесь с исключением, определит судьбу вашей программы. В примере с ошибкой переполнения на рис. 2.13, исключе¬ние перехватывала IDE, предоставляя дружественный пользовательский интерфейс, об¬легчающий понимание.
Рассмотрите исходный код, представленный на рис. 5.2, который создает исключе¬ние. Это называют передачей исключения (throwing).
Если бы метод RunAll () был запущен, Visual C# Express отобразил бы сообщении об исключении, представленное на рис. 5.3 (для запуска отладчика используйте кла¬вишу ).
Исключение не вызывало остановки операционной системы или среды разработки fcual C# Express, поскольку его перехватил встроенный обработчик исключений Visual Studio. Среда Visual Studio приняла управление на себя, и остановила работу только вашей программы.
Вообразите, если бы среда Visual Studio не была запущена. Созданное исключе-
■ве заставило бы программу остановиться, и вы получили бы системное сообщение
:" :шибке, указывающее на ошибочный объект, номер строки и стек. Большинство
I :.тьзователей понятия не имели бы, что произошло и, вероятно, посчитали бы это сбо-
к эмпьютера.
Что вам необходимо сделать, так это перехватить (catch) и обработать исключение, гак это делала среда Visual Studio. Например, если бы вы знали, что исключение может происходить в методе RunAll (), то изменили бы его код следующим образом:
:lass MyType
public int DataMember;
riass Tests
public void GeneratesException ()
MyType els = null; els. DataMember = 10;
:ublic void RunAll ()
try 1
GeneratesException(); }
catch (Exception) {
}
}
}
Код, выделенный полужирным шрифтом, — это блок: исключения (exception block который перехватывает исключение и позволяет вам отреагировать на него. В этом примере, тем не менее, ничего после перехвата исключения не происходит. Если вь: запустите эту программу, то среда Visual C# Express не будет отображать сообщения об исключении, и программа продолжит работу без проблем. С точки зрения средь: Visual C# Express, все сработало нормально.
Но даже несмотря на то, что программа продолжила работать, была ли устранена проблема? Уверен, вы догадались, ответ — нет. Программа поглотила исключение, ни¬как не отреагировав на проблему. Если бы мы оставили такую ситуацию в реально;: программе, то она вряд ли смогла бы претендовать на популярность у пользователей.
На заметку. На практике бывают редкие ситуации, когда сообщение об ошибке следует скрыть, поскольку вы никак не можете обработать его. Это случается, когда вы имеете дело с сетевыми соединениями, операциями с базой данных или другими проблемами, находящимися вне кон¬троля вашей программы. Но в большинстве случаев поглощать исключение нельзя.
Какова же реальная ситуация, в которой вы могли бы передавать исключения/ Как быть, если параметр недопустим? Как вы узнаете далее, в разделе "Фильтрация ис -ключений", именно для этой цели существует исключение типа ArgumentException ( Разработчики, получившие это исключение, сразу поймут, что они должны испра вить параметр. Это сэкономит много времени на отладку и уменьшит общее время разработки.
Реальная работа по обработке исключений связана с размышлениями обо всех возможных исключениях, которые могут произойти. Но что имеет больше смысла — отслеживание причины ошибки или добавление кода, способного легче находить ошибки? В конечном счете добавление кода, отслеживающего ошибку, сэкономит вре¬мя и поможет избежать огорчений.