![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Опишем возможности по генерации и обработке исключительных ситуаций в языке 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!