Перехват и создание исключений стандартных типов
Обновлен: Ноябрь 2007
В следующих правилах описаны рекомендации по использованию некоторых наиболее распространенных исключений, предоставляемых библиотекой .NET Framework. Полный список классов исключений, предоставляемых библиотекой .NET Framework, см. в документации Справочник по библиотеке классов .NET Framework.
Exception и SystemException
Не вызывайте исключение System.Exception или System.SystemException.
Не перехватывайте исключение System.Exception или System.SystemException в своем коде, только если не планируется его повторный вызов.
Избегайте перехватов исключений System.Exception или System.SystemException, за исключением обработчиков исключений высокого уровня.
ApplicationException
Производные пользовательские исключения следует создавать из класса T:System.Exception, а не из класса T:System.ApplicationException.
Изначально предполагалось, что пользовательские исключения должны наследовать от класса ApplicationException, однако это не имеет особого значения. Дополнительные сведения см. в разделе Лучшие методики обработки исключений.
InvalidOperationException
При возникновении непредусмотренного состояния вызывайте исключение System.InvalidOperationException. Исключение System.InvalidOperationException следует вызывать, если установка свойства или вызов метода не соответствуют текущему состоянию объекта. Например, запись в поток System.IO.FileStream, открытый для чтения, должна привести к вызову исключения System.InvalidOperationException.
Это исключение также следует вызывать, когда комбинированное состояние набора связанных объектов недопустимо для операции.
ArgumentException, ArgumentNullException и ArgumentOutOfRangeException
Исключение System.ArgumentException или один из его подтипов вызывается в том случае, если члену передаются недопустимые аргументы. По возможности выбирайте тип исключения, замыкающий цепочку наследования.
В следующем примере кода показан вызов исключения, когда аргумент равен null (Nothing в Visual Basic).
If (anObject = Nothing) Then
Throw New ArgumentNullException("anObject", "Specify a non-null argument.")
End If
if (anObject == null)
{
throw new ArgumentNullException("anObject",
"Specify a non-null argument.");
}
При вызове исключения System.ArgumentException или одного из его производных типов установите значение свойства System.ArgumentException.ParamName. В этом свойстве хранится имя параметра, послужившего причиной вызова исключения. Обратите внимание, что значение свойства можно установить с использованием одной из перегрузок конструктора.
Используйте значение для имени неявного параметра значения методов установки свойств.
В следующем примере кода показано свойство, вызывающее исключение при передаче аргумента "null".
Public Property Address() As IPAddress
Get
Return IPaddr
End Get
Set(ByVal value As IPAddress)
If IsNothing(value) Then
Throw New ArgumentNullException("value")
End If
IPaddr = value
End Set
End Property
public IPAddress Address
{
get
{
return address;
}
set
{
if(value == null)
{
throw new ArgumentNullException("value");
}
address = value;
}
}
Не позволяйте открыто вызываемым интерфейсам API явно или неявно вызывать исключения System.NullReferenceException, System.AccessViolationException, System.InvalidCastException или System.IndexOutOfRangeException. Во избежание вызова этих исключений следует выполнять проверку аргументов. Вызов этих исключений предоставляет подробные сведения о реализации метода, которые могут измениться со временем.
StackOverflowException
Не вызывайте явно исключение System.StackOverflowException. Это исключение должно явно вызываться только средой CLR.
Не перехватывайте исключение System.StackOverflowException.
Крайне сложно программным образом решить проблему переполнения стека. Следует позволить этому исключению завершить процесс и использовать отладку для определения источника проблемы.
OutOfMemoryException
Не вызывайте явно исключение System.OutOfMemoryException. Это исключение должно вызываться только средой CLR.
ComException и SEHException
Не вызывайте явно исключение System.Runtime.InteropServices.COMException или System.Runtime.InteropServices.SEHException. Эти исключения должны вызываться только средой CLR.
Не перехватывайте явно исключение System.Runtime.InteropServices.SEHException.
ExecutionEngineException
Не вызывайте явно исключение System.ExecutionEngineException.
Фрагменты — © Корпорация Майкрософт (Microsoft Corp.), 2005. Все права защищены.
Фрагменты — © Addison-Wesley Corporation. Все права защищены.
Дополнительные сведения о руководствах по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.
См. также
Основные понятия
Выбор правильного типа создаваемого исключения