Compartilhar via


Criação e lançamento de exceções (guia de programação translation from VPE for Csharp)

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, lançada with the throw palavra-chave.O tempo de execução, em seguida, procura o manipulador de exceção mais compatível.

Os programadores devem lançar exceções quando uma ou mais das seguintes condições forem 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 telefonar inadequada a um objeto, com base no estado de objeto.

    Um exemplo pode estar tentando gravar um arquivo somente leitura.Em casos onde um estado de objeto não permite uma operação, gerar uma instância de InvalidOperationException ou um objeto com base em uma derivação dessa 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 faz com que uma exceção.

    Nesse caso, a exceção original deve ser identificada e uma ArgumentException instância deve ser criada. A exceção original deve ser passada para o construtor do ArgumentException sistema autônomo 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. Essa seqüência de caracteres contém o nome dos métodos na pilha de chamadas corrente, juntamente com o número de nome e a linha do arquivo onde a exceção foi lançada para cada método.A StackTrace objeto é criado automaticamente pelo common linguagem tempo de execução (CLR) do ponto da throw demonstrativo, para que as exceções devem ser lançadas do ponto onde deve iniciar o rastreamento da pilha.

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

Métodos públicos e protegidos devem lançar exceções, sempre que eles não podem concluir sua função pretendida.A classe de exceção é lançada deve ser a exceção mais específica que se ajusta as condições de erro disponível.Essas exceções devem ser documentadas sistema autônomo 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.

Aspectos a evitar ao lançamento de 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 sistema autônomo 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 sistema autônomo um valor retornado ou parâmetro em vez de ser lançada.

  • Não throw System.Exception, System.SystemException, System.NullReferenceException, ou System.IndexOutOfRangeException intencionalmente de seu próprio código fonte.

  • Não crie exceções que podem ser geradas no modo de depurar, mas não liberar modo.Para identificar erros em time de execução durante a fase de desenvolvimento, use depurar Assert.

Definindo classes de exceção

Programas podem lançar uma classe de exceção predefinidos no System namespace (exceto onde observado anteriormente), ou criar suas próprias classes de exceção, derivando de ApplicationException. As classes derivadas devem definir pelo menos quatro construtores: padrão de um construtor, uma que define a propriedade de mensagem e outra que define o 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() { }
    public InvalidDepartmentException(string message) { }
    public InvalidDepartmentException(string message, System.Exception inner) { }

    // Constructor needed for serialization 
    // when 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 eles fornecem são úteis para resolver a exceção.Se forem adicionadas novas propriedades à 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 as seções a seguir no Especificação da linguagem C#:

  • 8.9.5 A demonstrativo throw

  • 8.10 A demonstrativo try

  • 16 Exceções

Consulte também

Conceitos

Guia de Programação C#

Referência

Exceções e manipulação de exceção (guia de programação C#)

Tratamento exceção (guia de programação translation from VPE for Csharp)