В текущем классе 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 (с дополнительными свойствами в случае необходимости), который не переопределяет какие-либо члены базового класса.

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

<p id="AutBody_Root311">Построение специальных исключений, способ третий</p>

Если вы хотите создать по-настоящему интересный специальный класс исключения, тогда необходимо обеспечить наличие у класса следующих характеристик:

• он является производным от класса 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. Для его активизации наберите ехс и нажмите клавишу <ТаЬ> (в Visual Studio нажмите <Tab> два раза).

<p id="AutBody_Root312">Обработка множества исключений</p>
Перейти на страницу:

Похожие книги