Создайте новый проект консольного приложения по имени CustomException, скопируйте в него предыдущие файлы Car.cs и Radio.cs и измените название пространства имен, в котором определены типы Car и Radio, с SimpleException на CustomException.

Затем добавьте в проект новый файл по имени CarIsDeadException.cs и поместите в него следующее определение класса:

using System;

namespace CustomException

{

  // Это специальное исключение описывает детали условия

  // выхода автомобиля из строя .

  // (Не забывайте, что можно также просто расширить класс Exception.)

  public class CarIsDeadException : ApplicationException

  {

  }

}

Как и с любым классом, вы можете создавать произвольное количество специальных членов, к которым можно обращаться внутри блока catch в вызывающем коде. Кроме того, вы можете также переопределять любые виртуальные члены, определенные в родительских классах. Например, вы могли бы реализовать CarIsDeadException, переопределив виртуальное свойство Message.

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

public class CarIsDeadException : ApplicationException

{

  private string _messageDetails = String.Empty;

  public DateTime ErrorTimeStamp {get; set;}

  public string CauseOfError {get; set;}

  public CarIsDeadException(){}

  public CarIsDeadException(string message,

    string cause, DateTime time)

  {

    _messageDetails = message;

    CauseOfError = cause;

    ErrorTimeStamp = time;

  }

  // Переопределить свойство Exception.Message.

  public override string Message

    => $"Car Error Message: {_messageDetails}";

}

Здесь класс CarIsDeadException поддерживает закрытое поле (_messageDetails), которое представляет данные, касающиеся текущего исключения; его можно устанавливать с использованием специального конструктора. Сгенерировать такое исключение в методе Accelerate() несложно. Понадобится просто создать, сконфигурировать и сгенерировать объект CarIsDeadException, а не System.Exception:

// Сгенерировать специальное исключение CarIsDeadException.

public void Accelerate(int delta)

{

  ...

  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();

Итак, теперь, когда вы понимаете базовый процесс построения специального исключения, пришло время опереться на эти знания. 

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

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