Класс Exception

37

Все определяемые на уровне пользователя и системы исключения в конечном итоге всегда наследуются от базового класса System.Exception, который, в свою очередь, наследуется от класса System.Object. Ниже показано, как в целом выглядит этот класс (обратите внимание, что некоторые его члены являются виртуальными и, следовательно, могут переопределяться в производных классах):

public class Exception : ISerializable, _Exception
{
// Общедоступные конструкторы
public Exception(string message, Exception innerException);
public Exception(string message);
public Exception();
...
// Методы
public virtual Exception GetBaseException() ;
public virtual void GetObjectData(Serializationlnfо info,
StreamingContext context);
// Свойства
public virtual IDictionary Data { get; }
public virtual string HelpLink { get; set; }
public Exception InnerException { get; }
public virtual string Message { get; }
public virtual string Source { get; set; }
public virtual string StackTrace { get; }
public MethodBase TargetSite { get; }
...
}

Нетрудно заметить, что многие из содержащихся в System.Exception свойств являются по своей природе доступными только для чтения. Это объясняется тем, что для каждого из них значения, используемые по умолчанию, обычно поставляются в производных классах. Например, в производном классе IndexOutOfRangeException поставляется сообщение по умолчанию "Index was outside the bounds of the array" ("Индекс вышел за границы массива").

В следующей таблице приведено краткое описание некоторых наиболее важных свойств класса System.Exception:

Свойства класса Exception
Свойство Описание
Data Это свойство, доступное только для чтения, позволяет извлекать коллекцию пар "ключ/значение" (представленную объектом, реализующим интерфейс IDictionary), которая предоставляет дополнительную, определяемую программистом, информацию об исключении. По умолчанию эта коллекция является пустой.
HelpLink Это свойство позволяет получать или устанавливать URL-адрес, по которому доступен справочный файл или веб-сайт с детальным описанием ошибки.
InnerException Это свойство, доступное только для чтения, может применяться для получения информации о предыдущем исключении или исключениях, которые послужили причиной возникновения текущего исключения. Запись предыдущих исключений осуществляется путем их передачи конструктору самого последнего исключения.
Message Это свойство, доступное только для чтения, возвращает текстовое описание соответствующей ошибки. Само сообщение об ошибке задается в передаваемом конструктору параметре.
Source Это свойство позволяет получать или устанавливать имя сборки или объекта, который привел к выдаче исключения.
StackTrace Это свойство, доступное только для чтения, содержит строку с описанием последовательности вызовов, которая привела к возникновению исключения. Как нетрудно догадаться, это свойство очень полезно во время отладки или для сохранения информации об ошибке во внешнем журнале ошибок.
TargetSite Это свойство, доступное только для чтения, возвращает объект MethodBase с описанием многочисленных деталей метода, который привел к выдаче исключения (вызов вместе с ним ToString() позволяет идентифицировать этот метод по имени)

Давайте рассмотрим пример:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static int MyDel(int x, int y)
        {
            return x / y;
        }

        static void Main()
        {
            try
            {
                Console.Write("Введите x: ");
                int x = int.Parse(Console.ReadLine());
                Console.Write("Введите y: ");
                int y = int.Parse(Console.ReadLine());

                int result = MyDel(x, y);
                Console.WriteLine("Результат: " + result);
            }
            // Обрабатываем исключение возникающее при делении на ноль
            catch (DivideByZeroException ex)
            {
                Console.WriteLine("Деление на 0 detected!!!\n");
                Console.WriteLine("ОШИБКА: " + ex.Message + "\n\n");
                Main();
            }
            // Обрабатываем исключение при некорректном вводе числа в консоль
            catch (FormatException ex)
            {
                Console.WriteLine("Это НЕ число!!!\n");
                Console.WriteLine("ОШИБКА: " + ex.Message + "\n\n");
                Main();
            }

            Console.ReadLine();
        }
    }
}
Класс Exception in C#

Как видите в данном примере используется свойство Message, класса Exception, для вывода информации о возникшем исключении. Более подробно свойства класса Exception рассматриваются в следующей статье.

Пройди тесты
Лучший чат для C# программистов