Criação e lançamento de exceções (guia de programação de C#)

Exceções são usadas para indicar que um erro ocorreu durante a execução do programa. São criados objetos de exceção que descrevem um erro e, em seguida, acionada com o Lançar palavra-chave. O tempo de execução procura o manipulador de exceção mais compatível.

Os programadores devem lançar exceções quando uma ou mais das condições a seguir são verdadeiras:

  • O método não pode concluir sua funcionalidade definida.

    Por exemplo, se um parâmetro para um método tem um valor inválido:

    static void CopyObject(SampleClass original)
    {
        if (original == null)
        {
            throw new System.ArgumentException("Parameter cannot be null", "original");
        }
    
    }
    
  • É feita uma chamada inadequada a um objeto com base no estado do objeto.

    Um exemplo é tentar gravar em um arquivo somente leitura de leitura. Em casos onde o estado de um objeto não permite uma operação, lançar uma instância de InvalidOperationException ou um objeto com base em uma derivação desta classe. Este é um exemplo de um método que lança um InvalidOperationException objeto:

    class ProgramLog
    {
        System.IO.FileStream logFile = null;
        void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {}
    
        void WriteLog()
        {
            if (!this.logFile.CanWrite)
            {
                throw new System.InvalidOperationException("Logfile cannot be read-only");
            }
            // Else write data to the log and return.
        }
    }
    
  • Quando um argumento para um método causa uma exceção.

    Nesse caso, a exceção original deve ser detectada e um ArgumentException instância deve ser criada. A exceção original deve ser passada para o construtor da ArgumentException como o InnerException parâmetro:

    static int GetValueFromArray(int[] array, int index)
    {
        try
        {
            return array[index];
        }
        catch (System.IndexOutOfRangeException ex)
        {
            System.ArgumentException argEx = new System.ArgumentException("Index is out of range", "index", ex);
            throw argEx;
        }
    }
    

Exceções contém uma propriedade chamada StackTrace. Esta string contém o nome dos métodos na pilha de chamadas atual, juntamente com o número de linha e o nome do arquivo onde a exceção foi lançada para cada método. A StackTrace objeto é criado automaticamente pelo common language runtime (CLR) do ponto da throw de instrução, para que as exceções devem ser lançadas do ponto onde o rastreamento de pilha deve começar.

Todas as exceções contém uma propriedade chamada Message. Essa seqüência de caracteres deve ser definida para explicar o motivo da exceção. Observe que as informações que são sensíveis à segurança não devem ser colocadas no texto da mensagem. Além das Message, ArgumentException contém uma propriedade chamada ParamName que deve ser definido como o nome do argumento que causou a exceção ser acionada. No caso de um setter de propriedade, ParamName deve ser definido como value.

Os membros de métodos públicos e protegidos devem lançar exceções, sempre que ele não poderá concluir suas funções pretendidas. A classe de exceção é lançada deve ser a exceção mais específica disponível que atenda às condições de erro. Essas exceções devem ser documentadas como parte da funcionalidade de classe e classes derivadas ou atualizações para a classe original devem reter o mesmo comportamento para compatibilidade com versões anteriores. Para obter mais informações, consulte Diretrizes de design para exceções.

Procedimentos para evitar ao gerar exceções

A lista a seguir identifica as práticas recomendadas para evitar ao gerar exceções:

  • Exceções não devem ser usadas para alterar o fluxo de um programa como parte de execução comum. Exceções só devem ser usadas para relatar e manipular condições de erro.

  • Exceções não devem ser retornadas como um valor de retorno ou parâmetro em vez de ser lançada.

  • Não jogue a System.Exception, System.SystemException, System.NullReferenceException, ou System.IndexOutOfRangeException intencionalmente do seu próprio código de origem.

  • Não crie exceções que podem ser lançadas no modo de depuração, mas não o modo de versão. Para identificar erros em tempo de execução durante a fase de desenvolvimento, use depurar Assert.

Definir Classes de exceção

Programas podem lançar uma classe de exceção predefinidos na System o namespace (exceto onde observado anteriormente), ou criar suas próprias classes de exceção, derivando de Exception. As classes derivadas devem definir pelo menos quatro construtores: construtor padrão de um, que define a propriedade de mensagem e uma que define ambas as Message e InnerException Propriedades. O quarto construtor é usado para serializar a exceção. Novas classes de exceção devem ser serializáveis. Por exemplo:

[Serializable()]
public class InvalidDepartmentException : System.Exception
{
    public InvalidDepartmentException() : base() { }
    public InvalidDepartmentException(string message) : base(message) { }
    public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { }

    // A constructor is needed for serialization when an
    // exception propagates from a remoting server to the client. 
    protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info,
        System.Runtime.Serialization.StreamingContext context) { }
}

Novas propriedades só devem ser adicionadas à classe de exceção quando os dados que elas fornecem são úteis para resolver a exceção. Se novas propriedades são adicionadas à classe derivada de exceção, ToString() deve ser substituído para retornar informações adicionadas.

Especificação da linguagem C#

Para obter mais informações, consulte C# Language Specification A especificação de linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

Exceptions and Exception Handling (C# Programming Guide)

(Guia de programação C#) de manipulação de exceção

Conceitos

C# Programming Guide

Hierarquia de exceções