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

Подробное рассмотрение класса Exception C#, Рассмотрение класса Exception в C#, Класс Exception в C#, Exception в C#, C# Полное руководство Герберт Шилдт, Язык программирования C#, C# полное руководство

В приведенных выше примерах исключения только перехватывались, но никакой существенной обработке они не подвергались. Как пояснялось выше, в операторе catch допускается указывать тип и переменную исключения. Переменная получает ссылку на объект исключения. Во всех исключениях поддерживаются члены, определенные в классе Exception, поскольку все исключения являются производными от этого класса. В этом разделе будет рассмотрен ряд наиболее полезных членов и конструкторов класса Exception и приведены конкретные примеры применения переменной исключения.
В классе Exception определяется ряд свойств. К числу самых интересных относятся три свойства: Message, StackTrace и TargetSite. Все эти свойства доступны только для чтения. Свойство Message содержит символьную строку, описывающую характер ошибки; свойство StackTrace — строку с вызовами стека, приведшими к исключительной ситуации, а свойство TargetSite получает объект, обозначающий метод, сгенерировавший исключение.
Кроме того, в классе 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); // вызвать метод 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()
      в UseExcept.Main()
   Свойство StackTrace: в ExcTest.genException()
      в UseExcept.Main()
   Свойство Message: Индекс находился вне границ массива.
   Свойство TargetSite: Void genException ()
   После блока перехвата исключения.

В классе Exception определяются четыре следующих конструктора:
   public Exception ()
   public Exception(string str)
   public Exception(string str, Exception inner)
   protected Exception (
                System.Runtime.Serialization.Serializationlnfo si,
                System.Runtime.Serialization.StreamingContext sc)

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