Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 161
- Предыдущая
- 161/642
- Следующая
Представленная выше логика обработки исключений приводит к возникновению ошибок на этапе компиляции. Проблема в том, что первый блок
catch
System.Exception
CarIsDeadException
ArgumentOutOfRangeException
catch
Запомните эмпирическое правило: блоки
catch
catch
catch
System.Exception
Таким образом, если вы хотите определить блок
catch
CarIsDeadException
ArgumentOutOfRangeException
// Этот код скомпилируется без проблем.
Console.WriteLine("***** Handling Multiple Exceptions *****\n");
Car myCar = new Car("Rusty", 90);
try
{
// Вызвать исключение выхода за пределы диапазона аргумента.
myCar.Accelerate(-10);
}
catch (CarIsDeadException e)
{
Console.WriteLine(e.Message);
}
catch (ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
}
// Этот блок будет перехватывать все остальные исключения
.
// помимо CarIsDeadException и ArgumentOutOfRangeException
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.ReadLine();
На заметку! Везде, где только возможно, отдавайте предпочтение перехвату специфичных классов исключений, а не общего класса
System.Exception
catch
System.Exception
Общие операторы catch
В языке C# также поддерживается "общий" контекст
catch
// Общий оператор catch.
Console.WriteLine("***** Handling Multiple Exceptions *****\n");
Car myCar = new Car("Rusty", 90);
try
{
myCar.Accelerate(90);
}
catch
{
Console.WriteLine("Something bad happened...");
// Произошло что-то плохое...
}
Console.ReadLine();
Очевидно, что это не самый информативный способ обработки исключений, поскольку нет никакой возможности для получения содержательных данных о возникшей ошибке (таких как имя метода, стек вызовов или специальное сообщение). Тем не менее, в C# такая конструкция разрешена, потому что она может быть полезной, когда требуется обрабатывать все ошибки в обобщенной манере.
Повторная генерация исключений
Внутри логики блока
try
throw
catch
catch
// Передача ответственности.
...
try
{
// Логика увеличения скорости автомобиля...
}
catch(CarIsDeadException e)
{
// Выполнить частичную обработку этой ошибки и передать ответственность.
throw;
}
...
Имейте в виду, что в данном примере кода конечным получателем исключения
CarIsDeadException
Также обратите внимание на неявную повторную генерацию объекта
CarIsDeadException
throw
- Предыдущая
- 161/642
- Следующая