Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обработка исключительных ситуаций.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
91 Кб
Скачать
☆

13.10 Подробное рассмотрение класса Exception

В приведенных выше примерах исключения только перехватывались, но никакой существенной обработке они не подвергались. Как пояснялось выше, в операторе catch допускается указывать тип и переменную исключения. Переменная получает ссылку на объект исключения. Во всех исключениях поддерживаются члены, опреде­ленные в классе Exception, поскольку все исключения являются производными от этого класса. В этом разделе будет рассмотрен ряд наиболее полезных членов и кон­структоров класса Exception и приведены конкретные примеры использования пере­менной исключения.

В классе Exception определяется ряд свойств. К числу самых интересных отно­сятся три свойства: Message, StackTrace и TargetSite. Все эти свойства доступны только для чтения. Свойство Message содержит символьную строку, описывающую характер ошибки; свойство StackTrace  строку с вызовами стека, приведшими к ис­ключительной ситуации, а свойство TargetSite получает объект, обозначающий ме­тод, сгенерировавший исключение.

Кроме того, в классе Exception определяется ряд методов. Чаще всего приходится пользоваться методом ToString(), возвращающим символьную строку с описанием исключения. Этот метод автоматически вызывается, например, при отображении ис­ключения с помощью метода WriteLine().

Применение всех трех упомянутых выше свойств и метода из класса Exception демонстрируется в приведенном ниже примере программы.

Листинг 13.12

// Использовать члены класса Exception.

using System;

class ExcTest

{

public static void GenException()

{

int[] nums = new int[4];

Console.WriteLine("До генерирования исключения.");

// Сгенерировать исключение в связи с выходом за границы массива.

for(int i=0; i < 10; i++) {

nums[i] = i;

Console.WriteLine("nums[{0}]: {1}", i, nums[i]);

}

Console.WriteLine("Не подлежит выводу");

}

}

class UseExcept

{

static void Main()

{

try {

ExcTest.GenException();

}

catch (IndexOutOfRangeException exc)

{

Console.WriteLine("Стандартное сообщение: ");

Console.WriteLine(exc); // вызвать метод ToString()

Console.WriteLine("Свойство StackTrace: " + exc.StackTrace);

Console.WriteLine("Свойство Message: " + exc.Message);

Console.WriteLine("Своймтво TargetSite: " + exc.TargetSite);

}

Console.WriteLine("После блока перехвата исключения.");

}

}

При выполнении этой программы получается следующий результат.

До генерирования исключения.

nums[0]: 0

nums[1]: 1

nums[2]: 2

nums[3]: 3

Стандартное сообщение таково: System.IndexOutOfRangeException: Индекс находился вне границ массива.

в ExcTest.genException() в <имя_файла>:строка 15

в UseExcept.Main()в <имя_файла>:строка 29

Свойство StackTrace: в ExcTest.genException()в <имя_файла>:строка 15

в UseExcept.Main()B <имя_файла>:строка 29

Свойство Message: Индекс находился вне границ массива.

Свойство TargetSite: Void genException()

После блока перехвата исключения.

В классе Exception определяются четыре следующих конструктора.

public Exception ()

public Exception(string сообщение)

public Exception(string сообщение, Exception внутреннее_исключение)

protected Exception(System.Runtime.Serialization.SerializationInfо информация,

System.Runtime.Serialization.StreamingContext контекст)

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

Следует также заметить, что в четвертом конструкторе класса Exception типы SerializationInfо и StreamingContext относятся к пространству имен System.Runtime.Serialization.