Создайте новый проект консольного приложения по имени 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();
Итак, теперь, когда вы понимаете базовый процесс построения специального исключения, пришло время опереться на эти знания.
Построение специальных исключений, способ второй