Класс Exception
37C# --- Руководство по C# --- Класс Exception
Все определяемые на уровне пользователя и системы исключения в конечном итоге всегда наследуются от базового класса 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:
Свойство | Описание |
---|---|
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();
}
}
}
Как видите в данном примере используется свойство Message, класса Exception, для вывода информации о возникшем исключении. Более подробно свойства класса Exception рассматриваются в следующей статье.