Язык программирования C#9 и платформа .NET5
NullReferenceException nullRefEx = new NullReferenceException();Console.WriteLine("NullReferenceException is-a SystemException? : {0}",nullRefEx is SystemException);Исключения уровня приложения (Systern.ApplicationException)
Поскольку все исключения .NET 5 являются типами классов, вы можете создавать собственные исключения, специфичные для приложения. Однако из-за того, что базовый класс
представляет исключения, генерируемые исполняющей средой, может сложиться впечатление, что вы должны порождать свои специальные исключения от типаSystem.SystemException. Конечно, можно поступать и так, но взамен их лучше наследовать от классаSystem.Exception:System.ApplicationExceptionpublic class ApplicationException : Exception{// Разнообразные конструкторы.}Как и в
, кроме набора конструкторов никаких дополнительных членов в классеSystemExceptionне определено. С точки зрения функциональности единственная цель классаApplicationExceptionсостоит в идентификации источника ошибки. При обработке исключения, производного отSystem.ApplicationException, можно предполагать, что исключение было сгенерировано кодовой базой выполняющегося приложения, а не библиотеками базовых классов .NET Core либо исполняющей средой .NET 5.System.ApplicationExceptionПостроение специальных исключений, способ первый
Наряду с тем, что для сигнализации об ошибке во время выполнения можно всегда генерировать экземпляры
(как было показано в первом примере), иногда предпочтительнее создавать строго типизированное исключение, которое представляет уникальные детали, связанные с текущей проблемой.System.ExceptionНапример, предположим, что вы хотите построить специальное исключение (по имени
) для представления ошибки, которая возникает из-за увеличения скорости обреченного на выход из строя автомобиля. Первым делом создается новый класс, унаследованный отCarIsDeadException(по соглашению имена всех классов исключений заканчиваются суффиксомSystem.Exception/System.ApplicationException).ExceptionНа заметку! Согласно правилу все специальные классы исключений должны быть определены как открытые (вспомните, что стандартным модификатором доступа для невложенных типов является
). Причина в том, что исключения часто передаются за границы сборок и потому должны быть доступны вызывающей кодовой базе.internalСоздайте новый проект консольного приложения по имени
, скопируйте в него предыдущие файлыCustomExceptionиCar.csи измените название пространства имен, в котором определены типыRadio.csиCar, сRadioнаSimpleException.CustomExceptionЗатем добавьте в проект новый файл по имени
и поместите в него следующее определение класса:CarIsDeadException.csusing System;namespace CustomException{// Это специальное исключение описывает детали условия// выхода автомобиля из строя .// (Не забывайте, что можно также просто расширить класс Exception.)public class CarIsDeadException : ApplicationException{}}Как и с любым классом, вы можете создавать произвольное количество специальных членов, к которым можно обращаться внутри блока
в вызывающем коде. Кроме того, вы можете также переопределять любые виртуальные члены, определенные в родительских классах. Например, вы могли бы реализоватьcatch, переопределив виртуальное свойствоCarIsDeadException.MessageВместо заполнения словаря данных (через свойство
) при генерировании исключения конструктор позволяет указывать отметку времени и причину возникновения ошибки Наконец, отметку времени и причину возникновения ошибки можно получить с применением строго типизированных свойств:Datapublic 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)