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

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

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






Исключение

Исключение — это отклонение от нормального выполнения программы, любое ошибочное условие или непредвиденное поведение, с которым сталкивается программа в процессе выполнения. Исключения могут возникать вследствие сбоя в вашем коде или в вызванном коде (таком как общая библиотека), недоступности ресурсов операционной системы, неожиданных условий, с которыми сталкивается общеязыковая среда выполнения (такими как код, который не может быть проверен), и т. д. При возникновении некоторых из этих условий приложение пользователя может выполнить восстановление самостоятельно, однако это возможно не всегда. Восстановление возможно для большинства случаев исключений приложений, но оно невозможно для подавляющей части исключений среды выполнения.

В платформе.NET Framework исключение - это объект типа, производного от System.Exception. Исключение посылается из области кода, где возникла проблема. Исключение передается в стек до тех пор, пока его не обработает приложение или не завершится выполнение программы.

Обработка исключений

Функции обработки исключений на языке C# помогают обрабатывать любые непредвиденные или исключительные ситуации, происходящие при выполнении программы. При этом следует руководствоваться следущими правилами.

Блок кода, начинающийся с ключевого слова try,используется для заключения в него инструкций, которые могут выдать исключения. При возникновении исключения в блоке try поток управления немедленно переходит к первому соответствующему обработчику исключений, присутствующему в стеке вызовов. В языке C# ключевое слово catch используется для определения обработчика исключений. В блоке catch происходит обработка ошибки.

Код в блоке finally выполняется даже при возникновении исключения. Блок finally используется для освобождения ресурсов, например для закрытия потоков или файлов, открытых в блоке try, поскольку код, следующий после конструкции try/catch не будет выполнен при возникновении исключения.

Блок try следует использовать с блоком catch либо finally; в него может входить несколько блоков catch. Оператор try без catch или finally вызовет ошибку компилятора. Общая схема выглядит следующим образом:

try

{

// код, который может вызвать исключение

}

catch (SomeSpecificException ex)

{

// код, обрабатывающий ошибку

}

finally

{

// код, который будет выполнен после блока try/catch

}

Блок catch указывает тип перехватываемого исключения. Этот тип называется фильтром исключений, он должен иметь тип Exception либо быть его производным. В программе может быть несколько блоков catch с различными фильтрами исключений. Первыми должны быть размещены блоки catch с самыми конкретными производными классами исключений, последним – блок catch без фильтра. Для каждого вызванного исключения выполняется первый блок catch, указывающий точный тип или базовый класс созданного исключения. Если блок catch, указывающий соответствующий фильтр исключения, отсутствует, будет выполнен блок catch без фильтра (если таковой имеется). Если обработчик для определенного исключения не существует, выполнение программы завершается с сообщением об ошибке.

Перехват исключений возможен при выполнении следующих условий.

· Понимание причины возникновения исключения и реализация особого восстановления, например перехват объекта FileNotFoundException и вывод запроса на ввод нового имени файла.

· Возможность создания и вызова нового, более конкретного исключения. Например:

int GetInt(int[] array, int index)

{

try

{

return array[index];

}

catch(System.IndexOutOfRangeException e)

{

throw new System.ArgumentOutOfRangeException("Parameter index is out of range.");

}

}

· Частичная обработка исключения. Например, блок catch можно использовать для добавления записи в журнал ошибок, но затем нужно повторно вызвать исключение, чтобы выполнить его последующую обработку.

try

{

// попытка доступа к ресурсу

}

catch (System.UnauthorizedAccessException e)

{

LogError(e); // запись в журнал

throw e; // повторное возбуждение исключения

}

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

В примере ниже метод тестирует деление на ноль и выполняет перехват соответствующей ошибки. Без обработки исключений эта программа была бы завершена с ошибкой DivideByZeroException was unhandled (не обработано исключение "деление на ноль").

class ExceptionTest

{

static double SafeDivision(double x, double y)

{

if (y == 0)

throw new System.DivideByZeroException();

return x / y;

}

static void Main()

{

double a = 98, b = 0; // данные введены для тестирования исключений

double result = 0;

try

{

result = SafeDivision(a, b);

Console.WriteLine("{0} divided by {1} = {2}", a, b, result);

}

catch (DivideByZeroException e)

{

Console.WriteLine("Attempted divide by zero.");

}

}

}

Инструкция finally предназначена для обеспечения немедленного выполнения необходимой очистки объектов, обычно занимающих внешние ресурсы, даже в случае, когда генерируется исключение. Примером подобной очистки является вызов метода Close для объекта класса FileStream сразу после его использования, не дожидаясь, когда этот объект будет уничтожен сборщиком мусора среды CLR, как показано ниже:

static void CodeWithCleanup()

{

System.IO.FileStream file = null;

System.IO.FileInfo fileInfo = null;

try

{

fileInfo = new System.IO.FileInfo("C:\\file.txt");

file = fileInfo.OpenWrite();

file.WriteByte(0xF);

}

catch(System.UnauthorizedAccessException e)

{

System.Console.WriteLine(e.Message);

}

finally

{

if (file!= null)

{

file.Close();

}

}

}

Так как исключение может произойти в любой момент внутри блока try до вызова метода OpenWrite() или ошибкой может завершится выполнение самого метода OpenWrite(), при выполнении попытки закрыть файл нет гарантии, что он открыт. Блок finally добавляет проверку, чтобы убедиться, что объект класса FileStream не имеет значения null, прежде чем вызывать метод Close.

Пользовательские исключения

Для того, чтобы сигнализировать об ошибке времени выполнения можно создавать собственные исключения, специфичные для вашего приложения. Для этого нужно создать пользовательский класс исключения, производный от класса System.Exception. Шаблон подобного класса приведён ниже.

[global::System.Serializable]

public class MyException: Exception

{

public MyException() { }

public MyException(string message): base(message) { }

public MyException(string message, Exception inner): base(message, inner) { }

protected MyException(

System.Runtime.Serialization.SerializationInfo info,

System.Runtime.Serialization.StreamingContext context)

: base(info, context) { }

}

Для генерации пользовательского исключения необходимо создать экземпляр нашего класса исключения и воспользоваться оператором throw.

...

MyException ex = new MyException("Здесь описание ошибки");

ex.HelpLink = "http://www.adres.ru"; // здесь служба поддержки

throw ex;

...

Контрольные вопросы

1) Что такое исключение?

2) Какие операторы заключаются в блок try?

3) Сколько блоков catch может быть расположено подряд? В чем их назначение?

4) В чем состоит значение механизма исключений в языке C#?

5) Какие операторы языка C# используются для обработки

исключений? Приведите синтаксис блока try…catch в общем виде.

Проиллюстрируйте его фрагментом программы на языке C#.

6) Что происходит в случае неудачного перехвата исключения?

7) В каком случае возможно использование оператора языка C#

catch без параметров?

8) Каким образом осуществляется возврат в программу после

обработки исключительной ситуации?

9) Приведите синтаксис блока finally (в составе оператора try …catch) в общем виде. Проиллюстрируйте его фрагментом программы на языке C#. Объясните применение ключевого слова finally.

10) С помощью какого ключевого слова происходит генерация исключений?

11) С какой целью создаются пользовательские исключения? Приведите фрагмент кода с описанием класса исключения.







Дата добавления: 2015-09-06; просмотров: 874. Нарушение авторских прав; Мы поможем в написании вашей работы!



Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

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

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Факторы, влияющие на степень электролитической диссоциации Степень диссоциации зависит от природы электролита и растворителя, концентрации раствора, температуры, присутствия одноименного иона и других факторов...

Йодометрия. Характеристика метода Метод йодометрии основан на ОВ-реакциях, связанных с превращением I2 в ионы I- и обратно...

Броматометрия и бромометрия Броматометрический метод основан на окислении вос­становителей броматом калия в кислой среде...

Анализ микросреды предприятия Анализ микросреды направлен на анализ состояния тех со­ставляющих внешней среды, с которыми предприятие нахо­дится в непосредственном взаимодействии...

Типы конфликтных личностей (Дж. Скотт) Дж. Г. Скотт опирается на типологию Р. М. Брансом, но дополняет её. Они убеждены в своей абсолютной правоте и хотят, чтобы...

Гносеологический оптимизм, скептицизм, агностицизм.разновидности агностицизма Позицию Агностицизм защищает и критический реализм. Один из главных представителей этого направления...

Studopedia.info - Студопедия - 2014-2024 год . (0.009 сек.) русская версия | украинская версия