Язык программирования C#9 и платформа .NET5
Часть 160 из 642 Информация о книге
CauseOfError = cause;ErrorTimeStamp = time;}}Затем необходимо модифицировать метод
с учетом обновленного специального исключения:Accelerate()throw new CarIsDeadException("You have a lead foot",DateTime.Now,$"{PetName} has overheated!"){HelpLink = "http://www.CarsRUs.com",};Поскольку создаваемые специальные исключения, следующие установившейся практике в .NET Core, на самом деле отличаются только своими именами, полезно знать, что среды Visual Studio и Visual Studio Code предлагает фрагмент кода, который автоматически генерирует новый класс исключения, отвечающий рекомендациям .NET. Для его активизации наберите
и нажмите клавишу <ТаЬ> (в Visual Studio нажмите <Tab> два раза).ехсОбработка множества исключений
В своей простейшей форме блок
сопровождается единственным блокомtry. Однако в реальности часто приходится сталкиваться с ситуациями, когда операторы внутри блокаcatchмогут генерировать многочисленные исключения. Создайте новый проект консольного приложения на C# по имениtry, скопируйте в него файлыProcessMultipleExpceptions,Car.csиRadio.csиз предыдущего проектаCarIsDeadException.csи надлежащим образом измените название пространства имен.CustomExceptionЗатем модифицируйте метод
классаAccelerate()так, чтобы он генерировал еще и предопределенное в библиотеках базовых классов исключениеCar, если передается недопустимый параметр (которым будет считаться любое значение меньше нуля). Обратите внимание, что конструктор этого класса исключения принимает имя проблемного аргумента в первом параметре типаArgumentOutOfRangeException, за которым следует сообщение с описанием ошибки.string// Перед продолжением проверить аргумент на предмет допустимости.public void Accelerate(int delta){if (delta < 0){throw new ArgumentOutOfRangeException(nameof(delta),"Speed must be greater than zero");// Значение скорости должно быть больше нуля!}...}На заметку! Операция
возвращает строку, представляющую имя объекта, т.е. переменнуюnameof()в рассматриваемом примере. Такой прием позволяет безопасно ссылаться на объекты, методы и переменные С#, когда требуются их строковые версии.deltaТеперь логика в блоке
может реагировать на каждый тип исключения специфическим образом:catchusing System;using System.IO;using ProcessMultipleExceptions;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);}Console.ReadLine();При написании множества блоков
вы должны иметь в виду, что когда исключение сгенерировано, оно будет обрабатываться первым подходящим блокомcatch. Чтобы проиллюстрировать, что означает "первый подходящий" блокcatch, модифицируйте предыдущий код, добавив еще один блокcatch, который пытается обработать все остальные исключения кромеcatchиCarIsDeadExceptionпутем перехвата общего типаArgumentOutOfRangeException:System.Exception// Этот код не скомпилируется!Console.WriteLine("***** Handling Multiple Exceptions *****\n");Car myCar = new Car("Rusty", 90);try{// Вызвать исключение выхода за пределы диапазона аргумента.myCar.Accelerate(-10);}catch(Exception e){// Обработать все остальные исключения?Console.WriteLine(e.Message);}catch (CarIsDeadException e){Console.WriteLine(e.Message);}catch (ArgumentOutOfRangeException e){Console.WriteLine(e.Message);}Console.ReadLine();