Поделиться через


Перехват и создание исключений стандартных типов

Обновлен: Ноябрь 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.

См. также

Основные понятия

Выбор правильного типа создаваемого исключения

Другие ресурсы

Руководство по разработке библиотек классов

Правила разработки исключений