Язык программирования C#9 и платформа .NET5. Страница 159
{ ... throw new CarIsDeadException( $"{PetName} has overheated!", "You have a lead foot", DateTime.Now) { HelpLink = "http://www.CarsRUs.com", }; ...}Для перехвата такого входного исключения блок
catchCarIsDeadExceptionSystem.CarIsDeadExceptionSystem.ExceptionSystem.Exceptionusing 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();Итак, теперь, когда вы понимаете базовый процесс построения специального исключения, пришло время опереться на эти знания.
Построение специальных исключений, способ второй
В текущем классе
CarIsDeadExceptionSystem.Exception.MessageMessagepublic 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; }}Обратите внимание, что на этот раз не объявляется строковая переменная для представления сообщения и не переопределяется свойство
MessageSystem.ApplicationExceptionНе удивляйтесь, если большинство специальных классов исключений (а то и все) будет соответствовать такому простому шаблону. Во многих случаях роль специального исключения не обязательно связана с предоставлением дополнительной функциональности помимо той, что унаследована от базовых классов. На самом деле цель в том, чтобы предложить строго именованный тип, который четко идентифицирует природу ошибки, благодаря чему клиент может реализовать отличающуюся логику обработки для разных типов исключений.
Построение специальных исключений, способ третий
Если вы хотите создать по-настоящему интересный специальный класс исключения, тогда необходимо обеспечить наличие у класса следующих характеристик:
• он является производным от класса
Exception/ApplicationException• в нем определен стандартный конструктор;
• в нем определен конструктор, который устанавливает значение унаследованного свойства
Message• в нем определен конструктор для обработки "внутренних исключений".
Чтобы завершить исследование специальных исключений, ниже приведена последняя версия класса
CarIsDeadExceptionpublic 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) {