|
Программирование >> Программирование с использованием ajax
В этом окне также можно изменять содержимое переменных, как показано на рис. 7.20.
Puc. 7.20. Пример изменения (одержимого переменной в окне Immediate В большинстве случаев требуемый эффект гораздо легче получать с использованием описанных выше окон мониторинга переменных, но прием с применением этого окна все равно удобен для выполнения более тонкой настройки значений и прекрасно подходит для тестирования выражений, результаты которых позже вряд ли будут представлять какой-либо интерес. Окно Call Stack Последнее окно, которое осталось рассмотреть, называется Call Stack (Стек вызовов) и показывает, каким образом было достигнуто текущее местонахождение. Попросту говоря, это означает, что оно отображает текущую функцию вместе с функцией, которая ее вызвала, потом функцией, которая вызвала эту функцию и т.д. (т.е. список вложенных вызовов функций). Точные точки, в которых делаются вызовы этих функций, тоже фиксируются. В случае предыдущего примера при переходе в режим Break во время нахождения внутри функции Maxima () или перемещении внутрь этой функции, благодаря пошаговому выполнению кода, в окне Call Stack появится информация, показанная на рис. 7.21. С*11 Stack Name Д X lang ChOTExOl .exeChOTExOl .Ргоуат.Млп( гпо[] args - str 1g(0]) Lr 15 + Oxb bytes □ Oi/tput jCall Stack r]lmm d(ete Window Puc. 7.21. Пример информации, отображаемой в окне Call Stack Выполнение двойного щелчка на записи позволит перейти к соответствующему месту в коде и отследить путь, которым выполнение кода достигло текущей точки. Данное окно особенно полезно при первом обнаружении ошибок, поскольку позволяет видеть, что произошло непосредственно перед возникновением той или иной ошибки. В случае возникновения ошибок в наиболее часто используемых функциях, это позволяет определять их источник. Иногда в этом окне отображается очень запутанная информация. Например, ошибки могут возникать и за пределами приложения, из-за неправильного применения внешних функций. В таких случаях в этом окне может содержаться длинный список записей, в котором только одна или две могут выглядеть знакомо. Просматривать внешние ссылки (при возникновении в том необходимости) можно, выполнив в этом окне щелчок правой кнопкой мыши и выбрав в контекстном меню пункт Show External Code (Показать внешний код). Обработка ошибок В первой части настоящей главы рассказывалось о том, как можно отыскивать и исправлять ошибки во время разработки приложения, чтобы они не возникали снова в рабочей версии кода. Иногда, однако, бывает известно, что ошибки все равно могут возникать и стопроцентного способа предотвратить их появление не существует. В таких ситуациях может быть предпочтительнее допускать вероятность возникновения проблем и писать код, являющийся достаточно надежным для того, чтобы справляться с этими ошибками аккуратным образом, без прерывания процесса выполнения. Все существующие для этого приемы вместе называются обработкой ошибок. В настоящем разделе речь пойдет об исключениях и том, как их обрабатывать. Исключением (exception) называется такая ошибка, которая генерируется в основном коде или в какой-то вызываемой им функции во время выполнения. Определение ошибки здесь немного более размыто, чем было до этого, поскольку исключения могут генерироваться вручную, внутри функций и т.д. Например, исключение внутри функции может генерироваться в случае, если один из ее строковых параметров не начинается с буквы а . Строго говоря, оно в таком случае не является ошибкой за рамками контекста функции, но будет восприниматься как таковое вызывающим эту функцию кодом. Вам уже доводилось встречаться с исключениями несколько раз в этой книге. Пожалуй, простейшим примером является попытка обратиться к элементу массива за его пределами: int[] myArray = {1, 2, 3, 4); int myElem = myArray[4]; Этот код приведет к отображению приведенного ниже сообщения об исключении и завершению приложения: Index was outside the bounds of the array. Индекс выходит за пределы массива. В этой книге уже показывались примеры окна, которое отображаться в подобных случаях. Оно содержит информацию о вызвавшем проблему коде, ссылки для доступа к соответствующим материалам справочной системы .NET, а также ссылку View Detail (Просмотреть детали), позволяющую получать дополнительные сведения о возникшем исключении. Исключения определяются в пространствах имен и в большинстве случаев имеют имена, которые делают очевидным их предназначение. В приведенном примере сгенерированное исключение имеет имя System. IndexOutOfRangeException, в котором есть смысл, поскольку предоставленный индекс выходит за пределы диапазона (out of range), допустимого в myArray. Появление сообщения об исключении и завершение работы приложения происходит только в тех случаях, когда исключение никак не обрабатывается. В следующем разделе будет показано, что нужно делать для обработки исключения. Ключевые слова try. . .catch. . .finally в состав языка С# входит синтаксис для структурной обработки исключений (Structured Exception Handling - SHE). С помощью трех ключевых слов - try, catch и finally - код помечается, как способный обрабатывать исключения, и снабжается инструкциями касательно того, что именно ему делать при возникновении исключения. Все ключевые слова имеют ассоциируемый блок кода и должны обязательно использоваться в строго следующем друг за другом порядке. Базовая структура выглядит, как показано ниже: catch {<тип исключения> е) inally Еще, однако, допускается создавать блоки try и finally без блока catch или блок try с несколькими блоками catch. При наличии одного и более блоков catch блок finally является необязательным, а в противном случае, при отсутствии блоков catch, соответственно, наоборот - обязательным. Способы применения всех этих блоков описаны ниже. □ try. Содержит код, который может генерировать (throw) исключения. □ catch. Содержит код, подлежащий выполнению при выдаче исключений. Блоки catch могут настраиваться так, чтобы они реагировали только на исключения определенных типов (например, исключения типа System. IndexOutOfRange Exception), путем использования параметра <тип исключения>, отсюда и происходит возможность предоставлять множество блоков catch. Также допускается и полностью опускать этот параметр и тем самым получать универсальный блок catch, способный реагировать на исключения всех типов. а finally. Содержит код, который выполняется всегда, либо после блока try, если не возникает никаких исключений, либо после блока catch, если обрабатывается какое-то исключение, или же непосредственно перед тем, как какое-нибудь необработанное исключение приведет к завершению приложения (тот факт, что данный блок обрабатывается в такой момент и служит причиной его существования; иначе код с таким же успехом можно было бы помещать и после этого блока). Ниже приведена последовательность событий, происходящих после возникновения исключения в коде внутри блока try. □ Выполнение блока try останавливается в точке, где возникло исключение. а Если существует какой-нибудь блок catch, тогда выполняется проверка на предмет соответствия этого блока типу сгенерированного исключения. Если никакого блока catch не существует, тогда выполняется блок finally (который, если нет ни одного блока catch, должен присутствовать обязательно). □ Если блок catch существует, но не является подходящим, выполняется проверка на предмет наличия других подходящих блоков catch. □ Если обнаружить совпадающий с типом исключения блок catch удается, выполняется содержащийся в нем код, после чего выполняется блок finally, если он присутствует. □ Если не удается обнаружить ни одного совпадающего с типом исключения блока catch, выполняется блок кода finally, если таковой присутствует. В следующем практическом занятии демонстрируется пример работы с исключениями - генерация исключений и несколько способов их обработки.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |