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

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

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






Исключение

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

В платформе.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; просмотров: 877. Нарушение авторских прав; Мы поможем в написании вашей работы!



Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

ОЧАГОВЫЕ ТЕНИ В ЛЕГКОМ Очаговыми легочными инфильтратами проявляют себя различные по этиологии заболевания, в основе которых лежит бронхо-нодулярный процесс, который при рентгенологическом исследовании дает очагового характера тень, размерами не более 1 см в диаметре...

Примеры решения типовых задач. Пример 1.Степень диссоциации уксусной кислоты в 0,1 М растворе равна 1,32∙10-2   Пример 1.Степень диссоциации уксусной кислоты в 0,1 М растворе равна 1,32∙10-2. Найдите константу диссоциации кислоты и значение рК. Решение. Подставим данные задачи в уравнение закона разбавления К = a2См/(1 –a) =...

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

Внешняя политика России 1894- 1917 гг. Внешнюю политику Николая II и первый период его царствования определяли, по меньшей мере три важных фактора...

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

БИОХИМИЯ ТКАНЕЙ ЗУБА В составе зуба выделяют минерализованные и неминерализованные ткани...

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