Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Системные исключения и их обработка






В языке С# исключение это объект класса System.Exception или производного от него класса. В пространство имен System входят кроме Exception ещё несколько классов исключений, которыми можно пользоваться в программах. В таблице 16.1 приведены исключения из пространства System, соответствующие особым ситуациям в программах на С#.

Таблица 16.1. Классы системных исключений.

 

ArgumentException Недопустимое значение аргумента при вызове метода
ArithmeticException Базовый класс для исключений, которые возникают при выполнении арифметических операций. Например, DivideByZeroException или OverflowException.
ArrayTypeMismatchException Посылается при попытке присвоить элементу массива значение, тип которого не совместим с типом элементов массива.
DivideByZeroException Посылается при попытке деления на нуль целочисленного значения.
FormatException Несоответствие параметров спецификации форматирования
IndexOutOfRangeException Посылается при выходе индекса массива за пределы граничной пары (индекс отрицателен или больше верхней границы).
InvalidCastException Посылается при неверном преобразовании от базового типа или базового интерфейса к производному типу.
NullReferenceException Посылается при попытке применить ссылку со значением nullдля обращения к объекту.
OutOfMemoryException Посылается при неудачной попытке выделить память с помощью операции new.(Недостаточно свободной памяти.)
OverflowException Посылается при переполнениях в арифметических выражениях, выполняемых в контексте, определенном служебным словом checked.
RanException Несоответствие размерностей параметра и аргумента при вызове метода.
StackOverflowException Посылается при переполнении рабочего стека. Возникает, когда вызвано слишком много методов, например, при очень глубокой или бесконечной рекурсии.
TypelnitializationException Посылается, когда исключение посылает статический конструктор и отсутствует обработчик исключений (catch-блок) для перехвата исключения

Исключения определены не только в пространстве имён System. В других пространствах имеются исключения, которые относятся к соответствующим разделам библиотек среды исполнения.NET. Например, в пространстве System.Drawing.Printing имеются исключения, соответствующие особым ситуациям вывода на печать и т.д.

Исключение создаётся с помощью специального оператора генерации (посылки) исключения:

throw выражение;

Однако этот оператор будет нами рассмотрен позже. Гораздо важнее сейчас научиться распознавать появление исключений и обрабатывать эти исключения. Дело в том, что при выявлении особых ситуаций, методы библиотечных классов, которыми мы уже пользуемся в программах, посылают исключения, и нужно уметь их распознавать и обрабатывать.

Достаточно часто начинающий программист наталкивается на исключения, возникающие из-за неверного ввода данных при выполнении совершенно правильной программы. В качестве примера рассмотрим такой фрагмент кода (программа 16_01.cs):

double x;

Console.Write(" x = ");

x = double.Parse(Console.ReadLine());

Console.WriteLine(" res = " + x);

Если пользователь в ответ на приглашение " x=" введёт, например, 3.3, то есть допустит ошибку, отделив дробную часть вещественного числа не запятой, а точкой, или введёт вместо цифры букву, то программа завершится аварийно и выдаст такое сообщение о необработанном исключении:

Необработанное исключение:

System.FormatException: Входная строка имела неверный формат, в System.Double.Parse(String s)

В этом сообщении об исключении указано, что его источник – метод System.Double.Parse(String s).

Для перехвата и обработки исключений используется конструкция, называемая блоком try/catch. Она состоит из двух частей. Первая часть – блок контроля за возникновением исключений – представляет собой заключённую в фигурные скобки последовательность операторов языка С#. Перед открывающейся фигурной скобкой размещается служебное слово try. Непосредственно за фигурной скобкой, закрывающей блок контроля за исключениями, размещается последовательность ловушек (иначе называемых обработчиками) исключений, а также необязательный блок завершения (finally-блок). Каждый обработчик исключений вводится служебным словом catch. Имеется три формы catch-инструкции:

catch (тип_исключения имя) {операторы}

catch (тип_исключения) {операторы}

catch {операторы}

Входящий в catch-инструкцию блок операторов предназначен для выполнения действий по обработке полученного исключения.

Блок завершения имеет такой формат:

finally {операторы}

Операторы блока завершения выполняются в конце обработки каждого исключения. Точнее, блок finally выполняется всегда независимо от того, как поток управления покидает блок try.

В стандарте языка С# конструкция try/catch/finally называется оператором try. Определены три формы оператора try:

■ блок контроля, за которым следуют catch-обработчики (один или несколько);

■ блок контроля, за которым следует блок завершения (finally-блок);

■ блок контроля, за которым следуют catch-обработчики (один или несколько), за которыми размещён блок завершения (finally-блок).

В качестве примера применения конструкции try/catch дополним приведённую выше программу, которая аварийно завершается при неверно введённых данных, средствами для обработки исключений типа System.FormatException. Фрагмент кода станет таким:

double x;

while (true)

{

try

{

Console.Write(" x = ");

x = double.Parse(Console.ReadLine());

Console.WriteLine(" res = " + x);

}

catch (FormatException)

{

Console.WriteLine(" Ошибка в формате данных! ");

continue;

}

break;

}

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

Console.Write(" x = ");

x = double.Parse(Console.ReadLine());

Console.WriteLine(" res = " + x);

Во втором из них возможна генерация исключения System.FormatException. Если оно появляется, то управление передаётся за пределы блока контроля (его третий оператор пропускается). Ловушка (обработчик) исключений с заголовком catch (FormatException) настроена на обработку исключений типа FormatException. В теле обработчика два оператора. Первый из них выдаёт на консоль сообщение, второй передаёт управление на начало следующей итерации цикла. Цикл не будет завершён, пока пользователь не введёт значение х без ошибок. Диалог пользователя с программой может быть, например, таким:

х = 3.5< ENTER>

Ошибка в формате данных!

х = 3d5< ENTER>

Ошибка в формате данных!

х = 3, 5< ENTER>

res = 3, 5

Обратите внимание, что в блоке контроля за исключениями оператор Console.WriteLine(" res=" +x); выполняется только один раз.

Порядок действий по контролю за возникновением исключений и их обработкой следующий. Выполняются операторы блока контроля за исключениями. Если исключений не возникло, то все catch-обработчики пропускаются. При возникновении исключения управление незамедлительно передаётся catch-блокам. Обработчики исключений просматриваются последовательно до тех пор, пока не будет обнаружен обработчик, " настроенный" на переданное исключение. После выполнения операторов этого обработчика выполняется блок завершения (если он есть) и только затем заканчивается исполнение try-оператора. Отметим, что среди блоков обработки выполняется только один или не выполняется ни один.

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.