Язык программирования C#9 и платформа .NET5. Страница 161
Представленная выше логика обработки исключений приводит к возникновению ошибок на этапе компиляции. Проблема в том, что первый блок
catchSystem.ExceptionCarIsDeadExceptionArgumentOutOfRangeExceptioncatchЗапомните эмпирическое правило: блоки
catchcatchcatchSystem.ExceptionТаким образом, если вы хотите определить блок
catchCarIsDeadExceptionArgumentOutOfRangeException// Этот код скомпилируется без проблем.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 и ArgumentOutOfRangeExceptioncatch (Exception e){ Console.WriteLine(e.Message);}Console.ReadLine();На заметку! Везде, где только возможно, отдавайте предпочтение перехвату специфичных классов исключений, а не общего класса
System.ExceptioncatchSystem.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# такая конструкция разрешена, потому что она может быть полезной, когда требуется обрабатывать все ошибки в обобщенной манере.
Повторная генерация исключений
Внутри логики блока
trythrowcatchcatch// Передача ответственности....try{ // Логика увеличения скорости автомобиля...}catch(CarIsDeadException e){ // Выполнить частичную обработку этой ошибки и передать ответственность. throw;}...Имейте в виду, что в данном примере кода конечным получателем исключения
CarIsDeadExceptionТакже обратите внимание на неявную повторную генерацию объекта
CarIsDeadExceptionthrow