Шрифт:
Интервал:
Закладка:
{
...
throw new CarIsDeadException(
$"{PetName} has overheated!",
"You have a lead foot", DateTime.Now)
{
HelpLink = "http://www.CarsRUs.com",
};
...
}
Для перехвата такого входного исключения блок catch теперь можно модифицировать, чтобы в нем перехватывался конкретный тип CarIsDeadException (тем не менее, с учетом того, что System.CarIsDeadException "является" System.Exception, по-прежнему допустимо перехватывать System.Exception):
using System;
using CustomException;
Console.WriteLine("***** Fun with Custom Exceptions *****n");
Car myCar = new Car("Rusty", 90);
try
{
// Отслеживать исключение.
myCar.Accelerate(50);
}
catch (CarIsDeadException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.ErrorTimeStamp);
Console.WriteLine(e.CauseOfError);
}
Console.ReadLine();
Итак, теперь, когда вы понимаете базовый процесс построения специального исключения, пришло время опереться на эти знания.
Построение специальных исключений, способ второй
В текущем классе CarIsDeadException переопределено виртуальное свойство System.Exception.Message с целью конфигурирования специального сообщения об ошибке и предоставлены два специальных свойства для учета дополнительных порций данных. Однако в реальности переопределять виртуальное свойство Message не обязательно, т.к. входное сообщение можно просто передать конструктору родительского класса:
public class CarIsDeadException : ApplicationException
{
public DateTime ErrorTimeStamp { get; set; }
public string CauseOfError { get; set; }
public CarIsDeadException() { }
// Передача сообщения конструктору родительского класса.
public CarIsDeadException(string message, string cause, DateTime time)
:base(message)
{
CauseOfError = cause;
ErrorTimeStamp = time;
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})}
}
Обратите внимание, что на этот раз не объявляется строковая переменная для представления сообщения и не переопределяется свойство Message. Взамен нужный параметр просто передается конструктору базового класса. При таком проектном решении специальный класс исключения является всего лишь уникально именованным классом, производным от System.ApplicationException (с дополнительными свойствами в случае необходимости), который не переопределяет какие-либо члены базового класса.
Не удивляйтесь, если большинство специальных классов исключений (а то и все) будет соответствовать такому простому шаблону. Во многих случаях роль специального исключения не обязательно связана с предоставлением дополнительной функциональности помимо той, что унаследована от базовых классов. На самом деле цель в том, чтобы предложить строго именованный тип, который четко идентифицирует природу ошибки, благодаря чему клиент может реализовать отличающуюся логику обработки для разных типов исключений.
Построение специальных исключений, способ третий
Если вы хотите создать по-настоящему интересный специальный класс исключения, тогда необходимо обеспечить наличие у класса следующих характеристик:
• он является производным от класса Exception/ApplicationException;
• в нем определен стандартный конструктор;
• в нем определен конструктор, который устанавливает значение унаследованного свойства Message;
• в нем определен конструктор для обработки "внутренних исключений".
Чтобы завершить исследование специальных исключений, ниже приведена последняя версия класса CarIsDeadException, в которой реализованы все упомянутые выше специальные конструкторы (свойства будут такими же, как в предыдущем примере):
public class CarIsDeadException : ApplicationException
{
private string _messageDetails = String.Empty;
public DateTime ErrorTimeStamp {get; set;}
public string CauseOfError {get; set;}
public CarIsDeadException(){}
public CarIsDeadException(string cause, DateTime time) :
this(cause,time,string.Empty)
{
}
public CarIsDeadException(string cause, DateTime time,
string message) : this(cause,time,message, null)
{
}
public CarIsDeadException(string cause, DateTime time,
string message, System.Exception inner) :
base(message, inner)
{
- Понимание SQL - Мартин Грубер - Базы данных