public class Exception:ISerializable, _Exception {
public virtual IDictionary Data { get; }
protected Exception(SerializationInfo info, StreamingContext context);
public Exception(string message, Exception innerException);
public Exception(string message);
public Exception();
public virtual Exception GetBaseException();
public virtual void GetObjectData(SerializationInfo info, StreamingContext context);
public System.Type GetType();
protected int HResult { get; set; }
public virtual string HelpLink { get; set; }
public System.Exception InnerException { get; }
public virtual string Message { get; }
public virtual string Source { get; set; }
public virtual string StackTrace { get; }
public MethodBase TargetSite { get; }
public override string ToString();
}
Как видите, многие свойства, определенные в классе System.Exception, доступны только для чтения. Причиной этого является тот простой факт, что производные типы обычно предусматривают для каждого свойства значение по умолчанию (например, для типа IndexOutOfRangeException принятым по умолчанию сообщением является "Index was outside the bounds of the array", т.е. "Выход индекса за границы массива").
Замечание. В .NET 2.0 System.Exception реализует интерфейс _Exception , чтобы соответствующие функциональные возможности были доступны неуправляемому программному коду.
В табл. 6.1 предлагаются описаний некоторых членов System.Exception.
Таблица 6.1.Основные члены типа System.Exception
Свойство |
Описание |
Data |
Добавлено в .NET 2.0. Предлагает коллекцию пар ключей и значений (пред-cтавленную объектом, реализующим IDictionary), которая обеспечивает дополнительную пользовательскую информацию о данном исключении. По умолчанию эта коллекция является пустой |
HelpLink |
Возвращает адрес URL файла справки с описанием ошибки во всех подробностях |
InnerException |
Доступно только для чтения. Может использоваться для получения информации о предыдущем исключении или исключениях, ставших причиной данного исключения. Запись предыдущих Исключений осуществляется путем передачи их конструктору самого последнего исключения |
Message |
Доступно только для чтения. Возвращает текстовое описание данной ошибки. Само сообщение об ошибке задается, как параметр конструктора |
Source |
Возвращает имя компоновочного блока, генерирующего исключение |
StackTrace |
Доступно только для чтения. Содержит строку, идентифицирующую последовательность вызовов, которые привели к исключительной ситуации. Как вы можете догадаться сами, это свойство оказывается очень полезным для отладки |
TargetSite |
Доступно только для чтения. Возвращает тип MethodBase, предлагающий самую разную информацию о методе, который генерировал исключение (ToString() будет идентифицировать имя соответствующего метода) |
Чтобы продемонстрировать "пользу" структурированной обработки исключений, нужно создать тип, который в подходящем окружении может генерировать исключение. Предположим, что мы создали новое консольное приложение с именeм SimpleException, в котором определяются два типа класса Car (автомобиль) и Radio (радио), связанные отношением локализации ("has-a"). Тип Radio определяет один метод, включающий и выключающий радио.
public class Radio {
public void TurnOn(bool on) {
if (on) Console.WriteLine("Радиопомехи…");
else Console.WriteLine ("И тишина…");
}
}
В дополнение к использованию типа Radio в рамках модели локализации/делегирования, тип Car определяет следующее поведение. Если пользователь объекта Car превысит предел для скорости (этот предел задается значением соответствующего члена-константы), то "двигатель взрывается" и объект Car становится непригодным для использования, что выражается в соответствующем изменении значения члена-переменной типа bool с именем carIsDead (автомобиль разрушен). Кроме того, тип Car имеет несколько членов-переменных, представляющих текущую скорость и "ласкательное имя", данное автомобилю пользователем, а также несколько конструкторов. Вот полное определение этого типа (с соответствующими примечаниями).
public class Car {
// Константа для максимума скорости.
public const int maxSpeed = 100;
// Данные внутреннего состояния.
private int currSpeed;
private string petName;
// Работает ли этот автомобиль?
private bool carIsDead;
// В автомобиле есть радио.
private Radio theMusicBox = new Radio();
// Конструкторы.
public Car() {}
public Car(string name, int currSp) {
currSpeed = currSp;
petName = name;
Читать дальше