Программирование >>  Программирование с использованием ajax 

1 ... 57 58 59 [ 60 ] 61 62 63 ... 396


В этой строке используется ключевое слово throw, которое предназначено для генерации исключения. Его нужно просто предоставлять вместе с инициализируемым с помощью new исключением в качестве параметра и тогда оно будет выдавать соответствующее исключение. В данном примере вместе с ними предоставляется еще одно исключение из пространства имен System, а именно - System.Exception.

Никакого оператора break; в данном случае не требуется: структуры block-throw вполне достаточно для завершения выполнения блока.

При обработке данного оператора с помощью кнопки Step Into вы окажетесь в общем блоке catch, который начинается в строке 84. Никаких совпадений с предыдущим блоком, который начинался в строке 28, обнаружено не было, поэтому вместо него и обрабатывается данный блок. Пошаговое выполнение этого кода позволит пройти этот блок, пройти блок finally и вернуться снова к выполнению еще одной итерации цикла в строке 25, предусматривающей вызов ThrowException ()с новым параметром, каковым на этот раз будет index .

Теперь ThrowException () сгенерирует исключение в строке 60:

eTypes[4] = error ;

Массив eTypes является глобальным, поэтому проблема здесь состоит не в невозможности получения доступа к этому массиву, а в попытке получить доступ к пятому элементу в нем (вспомните, что отсчет элементов начинается с 0), что приводит к генерации исключения System. IndexOutOf RangeException.

На этот раз в Main () имеется подходящий блок catch и поэтому дальнейший проход по коду приведет именно к этому блоку, который начинается в строке 28. Вызов Console .WriteLine () в данном блоке предусматривает вывод на экран хранящегося в исключении сообщения с использованием е. Mess age (исключение доступно через параметр этого блока catch). Опять-таки, пошаговое выполнение приводит сначала к прохождению блока finally (а не второго блока catch, поскольку исключение уже обработано), а затем - еще одной итерации цикла снова с вызовом ThrowException () в строке 25.

При достижении структуры switch в ThrowException () на этот раз произойдет вход в новый блок try, начинающийся в строке 63. А при достижении строки 48 будет выполнен вложенный вызов ThrowException (), на этот раз с параметром index . Можете воспользоваться кнопкой Step Over для пропуска подлежащих выполнению строк кода, потому вы уже их проходили. Как и ранее, данный вызов приведет к генерации исключения System. IndexOutOf RangeException, но на этот раз оно будет обрабатываться во вложенной структуре try. . .catch. . . finally, а именно- той, что находится внутри ThrowException (). В этой структуре нет никакого явного совпадения для исключения такого типа, поэтому его обработкой займется код в общем блоке catch (который начинается в строке 70).

Как и при обработке предыдущих исключений, далее вы пройдете этот блок catch и ассоциируемый с ним блок finally и достигнете кода вызова, но с одним важным отличием: хотя исключение и было сгенерировано, на этот раз оно было еще и обработано- кодом в ThrowException (). А это значит, что никакого исключения для обработки в Main () не останется и поэтому далее вы перейдете непосредственно к блоку finally, после чего произойдет завершение приложения.

Просмотр и конфигурирование исключений

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



приложениях. В IDE предусмотрено специальное диалоговое окно для просмотра и редактирования доступных исключений, отобразить которое можно, выбрав в меню Debug (Отладка) пункт Exceptions (Исключения) (или нажав <Ctrl+D>, <Е>). Это диалоговое окно показано на рис. 7.23 (в VS отображающиеся в списке элементы могут выглядеть по-другому).

Exceptions

Managrd DrbuQgmq At f if Unit

Ihrown User-unhsndled

Find-.

Puc. 7.23. Диалоговое окно Exceptions

Исключения в этом окне отображаются по категориям и пространствам имен библиотеки .NET. Увидеть исключения, доступные в пространстве имен System, например, можно, развернув сначала узел Common Language Runtime Exceptions (Исключения общеязыковой исполняющей среды), а затем узел System (Система). В списке, который появится после этого, будет присутствовать и уже продемонстрированное ранее в главе исключение System. IndexOutOfRangeException.

Каждое исключение можно конфигурировать с использованием флажков, которые расположены рядом. Первый флажок - Thrown (Генерируется) - позволяет делать так, чтобы прерывание и переход в режим отладки происходил даже в случае возникновения обрабатываемых исключений, а второй - так, чтобы необрабатываемые исключения игнорировались со всеми вытекающими из этого последствиями. В большинстве случаев игнорирование необрабатываемых исключений все равно приводит к переходу в режим Break, так что второй флажок применяется лишь в особых случаях.

Обычно предлагаемые по умолчанию настройки вполне приемлемы.

Примечания по обработке исключений

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

throw;

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



Например, если изменить блок try. . .catch. . .finally в ThrowException () из предыдущего примера, как показано ниже:

Console.WriteLine( ThrowException(\ nested index\ ) + try block reached. ); Console.WriteLine( ThrowException(\ index\ ) called. ); ThrowException( index ) ;

catch {

Console.WriteLine( ThrowException(\ nested index\ ) general + catch block reached. );

throw;

finally

Console.WriteLine( ThrowException(\ nested index\ ) finally + block reached. );

тогда поток выполнения сначала будет переходить к показанному здесь блоку finally, и только затем к соответствующему блоку catch в Main (). Отображаемый в результате в окне консоли вывод станет выглядеть по-другому, а именно - так, как показано на рис. 7.24.


Рис. 7.24. Вывод в окне консоли после изменения блока try.catch. . .finally

На этом экранном снимке видны дополнительные строки, которые будет выводить функция Main (), поскольку теперь исключение System. IndexOutOfRangeException перехватывается в ней.

Резюме

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

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

□ Способы использования Debug .WriteLine () и Trace .WriteLine () для вывода текста в окно Output.

□ Применение точек трассировки для вывода текста в окно Output.



1 ... 57 58 59 [ 60 ] 61 62 63 ... 396

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