Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Генерация и обработка исключительных ситуаций



Опишем возможности по генерации и обработке исключительных ситуаций в языке C#. Для генерации исключительной ситуации используется оператор throw:

throw [объект-класса-исключительной-ситуации];

Объект, указанный после throw, должен быть объектом класса исключительной ситуации. В C# классами исключительных ситуаций являются класс System.Exception и все его наследники. В некоторых языках для.NET можно (хотя и не рекомендуется) генерировать исключения, не являющиеся производными от Exception. В таком случае CLR автоматически поместит объект исключения в оболочку класса RuntimeWrappedException, который наследуется от Exception.

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

– свойство только для чтения Message, содержащее строку с описанием ошибки;

– перегруженный конструктор с одним параметром-строкой, записываемым в свойство Message;

– строковое свойство StackTrace, описывающее содержимое стека вызова, в которой первым отображается самый последний вызов метода.

– свойство InnerException – объект Exception, описывающий ошибку, вызывающую текущее исключение.

– коллекция-словарь Data с дополнительной информацией об ошибке.

В пространстве имён System содержится несколько классов для описания наиболее распространённых исключений. Упомянем некоторые из них:

1. ArgumentException – генерируется, когда методу передаётся недопустимый аргумент.

2. ArgumentNullException (наследник ArgumentException) – генерируется, когда методу передаётся аргумент, равный null.

3. ArgumentOutOfRangeException (наследник ArgumentException) – генерируется, если методу передаётся аргумент, выходящий за допустимый диапазон.

4. IndexOutOfRangeException – выбрасывается при попытке обратиться к элементу массива по индексу, который выходит за границы массива.

5. InvalidCastException – генерируется, когда явное преобразование типов завершается неудачей.

6. InvalidOperationException – сигнализирует о том, что состояние объекта препятствует выполнению метода (пример: запись в файл, который открыт только для чтения).

7. NotSupportedException – сигнализирует о том, что функциональная возможность не поддерживается.

8. NotImplementedException – сигнализирует о том, что функциональная возможность не реализована.

9. ObjectDisposedException – генерируется, когда метод вызывается у удалённого из памяти объекта.

Разработчик может создать собственный класс для представления информации об исключительной ситуации. Единственным условием для этого класса в C# является прямое или косвенное наследование от класса Exception.

Рассмотрим пример программы с генерацией исключительной ситуации:

using System;

public class ExampleClass

{

private int _field;

public int Field

{

get { return _field; }

set

{

if (value < 0)

{

// объект исключения создаётся "на месте"

throw new ArgumentOutOfRangeException();

}

_field = value;

}

}

}

public class MainClass

{

public static void Main()

{

var a = new ExampleClass();

a.Field = -3; // ИС генерируется, но не обрабатывается!

}

}

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

Опишем возможности по обработке исключительных ситуаций. Для перехвата исключительных ситуаций служит блок try – catch – finally. Синтаксис блока следующий:

try

{

[операторы,-способные-вызвать-исключительную-ситуацию]

}

[один-или-несколько-блоков-catch]

[finally

{

операторы-из-секции-завершения

}]

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

catch [(тип-ИС [идентификатор-объекта-ИС])]

{

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

}

Здесь идентификатор-объекта-ИС – это некая временная переменная, которая может использоваться для извлечения информации из объекта исключительной ситуации. Отдельно описывать эту переменную не надо. Если указать в блоке catch оператор throw без аргумента, это приведёт к тому, что обрабатываемая исключительная ситуация будет сгенерирована повторно.

Модифицируем программу, описанную выше, добавив в неё блок перехвата ошибки:

public static void Main()

{

var a = new ExampleClass();

try

{

Console.WriteLine("This line is printed always");

a.Field = -3;

Console.WriteLine("This line is not printed if the error");

}

catch (ArgumentOutOfRangeException ex)

{

Console.WriteLine(ex.Message);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

finally

{

Console.WriteLine("This line is printed always (finally)");

}

}

Если используется несколько блоков catch, то обработка исключительных ситуаций должна вестись по принципу «от частного – к общему», так как после выполнения одного блока catch управление передаётся на часть finally (при отсутствии finally – на оператор после try – catch). Компилятор C# не позволяет разместить блоки catch так, чтобы предыдущий блок перехватывал исключительные ситуации, предназначенные последующим блокам.





Дата публикования: 2015-11-01; Прочитано: 431 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...