День двести семидесятый. #BestPractices
Разработка Исключений
Использование Стандартных Типов Исключений
Далее описываются стандартные исключения, предоставляемые платформой, и подробности их использования. Список ни в коем случае не является исчерпывающим. Обратитесь к справочной документации по .NET Framework для использования других типов исключений.
Exception и SystemException
❌ ИЗБЕГАЙТЕ выбрасывания
❌ ИЗБЕГАЙТЕ перехватывания
❌ ИЗБЕГАЙТЕ перехватывания
ApplicationException
❌ ИЗБЕГАЙТЕ выбрасывания и наследования от
InvalidOperationException
✅ ИСПОЛЬЗУЙТЕ
ArgumentException, ArgumentNullException и ArgumentOutOfRangeException
✅ ИСПОЛЬЗУЙТЕ
✅ ИСПОЛЬЗУЙТЕ свойство
✅ ИСПОЛЬЗУЙТЕ ключевое слово
NullReferenceException, IndexOutOfRangeException и AccessViolationException
❌ ИЗБЕГАЙТЕ явного или неявного выбрасывания исключений типа
StackOverflowException
❌ ИЗБЕГАЙТЕ явного выбрасывания
❌ ИЗБЕГАЙТЕ перехвата
OutOfMemoryException
❌ ИЗБЕГАЙТЕ явного выбрасывания
ComException, SEHException и ExecutionEngineException
❌ ИЗБЕГАЙТЕ явного выбрасывания
Источник: https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/
Разработка Исключений
Использование Стандартных Типов Исключений
Далее описываются стандартные исключения, предоставляемые платформой, и подробности их использования. Список ни в коем случае не является исчерпывающим. Обратитесь к справочной документации по .NET Framework для использования других типов исключений.
Exception и SystemException
❌ ИЗБЕГАЙТЕ выбрасывания
System.Exception
или System.SystemException
.❌ ИЗБЕГАЙТЕ перехватывания
System.Exception
или System.SystemException
во внутреннем коде, если только вы не собираетесь их повторно выбросить.❌ ИЗБЕГАЙТЕ перехватывания
System.Exception
или System.SystemException
, за исключением обработчиков исключений верхнего уровня.ApplicationException
❌ ИЗБЕГАЙТЕ выбрасывания и наследования от
ApplicationException
.InvalidOperationException
✅ ИСПОЛЬЗУЙТЕ
InvalidOperationException
, если объект находится в неподходящем состоянии.ArgumentException, ArgumentNullException и ArgumentOutOfRangeException
✅ ИСПОЛЬЗУЙТЕ
ArgumentException
или один из его подтипов, если члену передаётся неверный аргумент. Отдавайте предпочтение наиболее производному типу исключения, если это возможно.✅ ИСПОЛЬЗУЙТЕ свойство
ParamName
при создании одного из подклассов ArgumentException
. Это свойство представляет имя параметра, вызвавшего исключение. Обратите внимание, что это свойство также может быть установлено с использованием одной из перегрузок конструктора.✅ ИСПОЛЬЗУЙТЕ ключевое слово
value
для имени неявного параметра-значения в установщике свойства.NullReferenceException, IndexOutOfRangeException и AccessViolationException
❌ ИЗБЕГАЙТЕ явного или неявного выбрасывания исключений типа
NullReferenceException
, AccessViolationException
или IndexOutOfRangeException
в публично вызываемом API. Эти типы исключения зарезервированы, выбрасываются механизмом выполнения и в большинстве случаев указывают на ошибку в коде. Выполняйте проверку аргументов, чтобы избежать выброса этих исключений. Выброс этих исключений раскрывает подробности реализации вашего метода, которая может меняться со временем.StackOverflowException
❌ ИЗБЕГАЙТЕ явного выбрасывания
StackOverflowException
. Это исключение должно явно выбрасываться только CLR.❌ ИЗБЕГАЙТЕ перехвата
StackOverflowException
. Практически невозможно написать согласованный управляемый код при наличии произвольных переполнений стека. Неуправляемые части CLR остаются согласованными благодаря использованию проверок для перемещения переполнений стека в четко определенные места, а не путем восстановлений после произвольных переполнений стека.OutOfMemoryException
❌ ИЗБЕГАЙТЕ явного выбрасывания
OutOfMemoryException
. Это исключение должно выбрасываться только инфраструктурой CLR.ComException, SEHException и ExecutionEngineException
❌ ИЗБЕГАЙТЕ явного выбрасывания
COMException
, ExecutionEngineException
или SEHException
. Эти исключения должны выбрасываться только инфраструктурой CLR.Источник: https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/