В текущем классе 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;
}
}
Обратите внимание, что на этот раз
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)
{
CauseOfError = cause;
ErrorTimeStamp = time;
}
}
Затем необходимо модифицировать метод Accelerate()
throw new CarIsDeadException("You have a lead foot",
DateTime.Now,$"{PetName} has overheated!")
{
HelpLink = "http://www.CarsRUs.com",
};
Поскольку создаваемые специальные исключения, следующие установившейся практике в .NET Core, на самом деле отличаются только своими именами, полезно знать, что среды Visual Studio и Visual Studio Code предлагает фрагмент кода, который автоматически генерирует новый класс исключения, отвечающий рекомендациям .NET. Для его активизации наберите ехс
Обработка множества исключений