День шестьдесят шестой. #ЗаметкиНаПолях

Исключения. Продолжение

Генерация исключений

При реализации своего метода нужно генерировать исключение, если метод не в состоянии решить возложенную на него задачу. При этом важно учесть два фактора:

1. Понять, к какому типу, производному от System.Exception будет относиться ваше исключение. Можно использовать один из типов FCL, либо создать собственный тип. При этом в иерархии типов должно быть как можно меньше базовых классов, т.к. перехват ошибок базового класса также перехватит и ошибки всех производных классов, а это может быть нежелательно.

2. Решить, какое сообщение должно быть передано конструктору исключения. Исключение должно содержать детальную информацию, почему метод не смог решить свою задачу. Обычно конечные пользователи приложения не имеют доступа к исходному коду, а приложения скрывают от них детали ошибок, поэтому в сообщение можно смело помещать всю техническую информацию, необходимую для устранения дефекта.

Выражение throw

Начиная с C# 7.0 throw можно использовать в контекстах, которые ранее не поддерживались:

1. Тернарный оператор

До C# 7.0 нужно было использовать if/else:

private static void DisplayFirstNumber(string[] args)

{

string arg = args.Length >= 1 ? args[0] :

throw new ArgumentException("Массив пустой");

}

2. Оператор объединения с NULL

public string Name

{

get => name;

set => name = value ??

throw new ArgumentNullException("Имя не может быть null", nameof(value));

}


3. Лямбда-выражение или лямбда-метод

DateTime ToDateTime(IFormatProvider provider) => 

throw new InvalidCastException("Преобразование в DateTime не поддерживается.");



Источники:

- Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 20.

-
https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/throw