Share via


Captura e a inclusão de tipos de exceção padrão

As diretrizes a seguir descrevem as práticas recomendadas para alguns dos mais comumente usados exceções fornecidas pelo.NET Framework.

Exceção e SystemException

Não jogue a System. Exception ou System. SystemException.

Não captura System. Exception ou System. SystemException no código de estrutura, a menos que pretenda relançar.

Evite a captura de System. Exception ou System. SystemException, exceto nos manipuladores de exceção de nível superior.

ApplicationException

Derive exceções personalizadas da classe T:System.Exception em vez de usar a classe T:System.ApplicationException.

Ele foi inicialmente pensou exceções personalizadas devem derivar de ApplicationException classe; No entanto, isso não foi encontrado para adicionar um valor significativo. Para obter mais informações, consulte Práticas recomendadas para tratamento de exceções.

InvalidOperationException

Lança uma exceção System. InvalidOperationException se estiver em um estado inadequado. System. InvalidOperationException deve ser lançada, se definir uma propriedade ou uma chamada de método não é adequada devido a estado atual do objeto. Por exemplo, a gravação de um System.IO.FileStream que foi aberto para leitura deve lançar uma exceção System. InvalidOperationException.

Essa exceção também deve ser lançada quando o estado combinado de um conjunto de objetos relacionados é inválido para a operação.

ArgumentException ArgumentNullException e ArgumentOutOfRangeException

Lança o System. ArgumentException ou um de seus subtipos se argumentos inválidos são passados para um membro. Prefira o tipo de exceção derivado para a maioria, se aplicável.

O exemplo de código a seguir demonstra a lançar uma exceção quando um argumento é null (Nothing em 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.");
}
if (anObject == nullptr)
{
    throw gcnew ArgumentNullException("anObject",
        "Specify a non-null argument.");
}

Defina a propriedade de System.ArgumentException.ParamName, quando lançar o System. ArgumentException ou um de seus tipos derivados. Essa propriedade armazena o nome do parâmetro que causou a exceção seja lançada. Observe que a propriedade pode ser definida usando uma das sobrecargas de construtor.

Use o valor para o nome do parâmetro value implícito de setters de propriedade.

O exemplo de código a seguir mostra uma propriedade que lança uma exceção se o chamador passa um argumento nulo.

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;
    }
}
property IPAddress^ Address
{
    IPAddress^ get()
    {
        return address;
    }
    void set(IPAddress^ value)
    {
        if (value == nullptr)
        {
            throw gcnew ArgumentNullException("value");
        }
        address = value;
    }
}

Não permita APIs publicamente callable explícita ou implicitamente lançar System. NullReferenceException, System. AccessViolationException, System. InvalidCastException ou System.IndexOutOfRangeException. Fazer a verificação para evitar a gerar essas exceções de argumento. Gerar essas exceções expõe os detalhes de implementação do seu método que pode ser alterado ao longo do tempo.

StackOverflowException

Não jogue exceção System. StackOverflowException explicitamente. Essa exceção ser lançada explicitamente somente pelo common language runtime (CLR).

Não captura uma exceção System. StackOverflowException.

É extremamente difícil manipular programaticamente um estouro de pilha. Você deve permitir essa exceção encerrar o processo e usar a depuração para determinar a origem do problema.

OutOfMemoryException

Não jogue System. OutOfMemoryException explicitamente. Essa exceção deve ser lançada apenas pela infra-estrutura de CLR.

ComException e SEHException

Não lança explicitamente System.Runtime.InteropServices.COMException ou System.Runtime.InteropServices.SEHException. Essas exceções devem ser lançadas apenas pela infra-estrutura de CLR.

Não captura System.Runtime.InteropServices.SEHException explicitamente.

ExecutionEngineException

Não jogue System. ExecutionEngineException explicitamente.

Portions Copyright 2005 Microsoft Corporation. Todos os direitos reservados.

Portions Copyright Addison-Wesley Corporation. Todos os direitos reservados.

Para obter mais informações sobre as diretrizes de design, consulte a "diretrizes de Design do Framework: Convenções, idiomas e padrões de reutilizável.Bibliotecas de rede" catálogo por Krzysztof Cwalina e Brad Abrams, publicado pela Addison-Wesley, 2005.

Consulte também

Conceitos

Escolhendo o tipo certo de exceção a ser lançada

Outros recursos

Diretrizes de Design para desenvolvimento bibliotecas de classe

Diretrizes de design para exceções