Чтение онлайн

ЖАНРЫ

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

Получить О

Делить на нуль нельзя После выхода из блока try.

Получить 1

Совпадающий элемент не найден.

После выхода из блока try.

Получить 2

После выхода из блока try.

Как следует из приведенного выше результата, блок finally выполняется независимо от причины выхода из блока try.

И еще одно замечание: с точки зрения синтаксиса блок finally следует после блока try, и

формально блоки
catch для этого не требуются. Следовательно, блок finally можно ввести непосредственно после блока try, опустив блоки catch. В этом случае блок finally начнет выполняться сразу же после выхода из блока try, но исключения обрабатываться не будут.

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

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

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

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

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

// Использовать члены класса 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("He подлежит выводу");

}

}

class UseExcept {

static void Main { try {

ExcTest.GenException;

}

catch (IndexOutOfRangeException exc) {

Console.WriteLine("Стандартное

сообщение таково: ");

Console.WriteLine(exc); // вызвать метод ToStringO Console.WriteLine("Свойство StackTrace: " + exc.StackTrace);

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

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

}

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

}

}

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

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

nums[0]: 0

nums[1]: 1 v

nums[2]: 2

nums[3]: 3

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

вне границ массива.

в ExcTest.genException в <имя_файла>:строка 15 в UseExcept.Mainв <имя_файла>:строка 2 9 Свойство StackTrace: в ExcTest.genExceptionв <имя_файла>:строка 15

в UseExcept.Mainв <имя_файла>:строка 2 9 Свойство Message: Индекс находился вне границ массива.

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

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

public Exception

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

public Exception(string сообщение, Exception внутреннее_исключение) protected Exception(System.Runtime.Serialization.Serializationlnfo информация, System.Runtime.Serialization.StreamingContext контекст)

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

Поделиться с друзьями: