Compartilhar via


Manipulação de exceções (Guia de Programação em C#)

Um bloco de tentativa é usado por programadores C# para dividir o código que pode ser afetado por uma exceção. Blocos de captura associados são usados para tratar todas as exceções resultantes. Um bloco de finalmente contém o código que é executado independentemente se uma exceção é lançada no bloco de try , como liberar os recursos que são atribuídos no bloco de try . Um bloco de try requer um ou vários blocos associados de catch , ou um bloco de finally , ou ambos.

Os exemplos a seguir mostram uma instrução de try-catch , uma instrução de try-finally , e uma instrução de try-catch-finally .

try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here. 
    // Only catch exceptions that you know how to handle. 
    // Never catch base class System.Exception without 
    // rethrowing it at the end of the catch block.
}
try
{
    // Code to try goes here.
}
finally
{
    // Code to execute after the try block goes here.
}
try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
}
finally
{
    // Code to execute after the try (and possibly catch) blocks  
    // goes here.
}

Um bloco de try sem um bloco de catch ou de finally causa um erro do compilador.

Blocos catch

Um bloco de catch pode especificar o tipo de exceção para capturar uma. A especificação de tipo é chamado um filtro de exceção. o tipo de exceção deve ser derivado de Exception. Em geral, não especifique Exception como o filtro de exceção ou a menos que você saiba o manipule as exceções que podem ser lançadas pelo bloco de try , ou incluir uma declaração de throw no final do bloco de catch .

Vários blocos de catch com os filtros diferentes de exceção podem ser encadeados juntos. Blocos de catch são avaliados de cima para baixo em seu código, mas somente um bloco de catch é executado para cada exceção que é lançada. O primeiro bloco de catch especificando o tipo exato ou uma classe base de exceção lançada é executado. Se nenhum bloco de catch especificar um filtro correspondente de exceção, um bloco de catch que não tenha um filtro é selecionado, se um está presente na instrução. É importante posicionar blocos de catch com (ou seja, os tipos de exceção os mais específicos mais derivada) primeiro.

Você deve capturar exceções quando as seguintes condições forem verdadeiras:

  • Você tem uma boa conhecimento sobre como a exceção pode ser acionada, e você pode implementar uma recuperação específica, como solicitar ao usuário para inserir um novo nome de arquivo quando você capture um objeto de FileNotFoundException .

  • Você pode criar e lançar uma exceção mais recente, específica.

    int GetInt(int[] array, int index)
    {
        try
        {
            return array[index];
        }
        catch(System.IndexOutOfRangeException e)
        {
            throw new System.ArgumentOutOfRangeException(
                "Parameter index is out of range.");
        }
    }
    
  • Você deseja manipular parcialmente uma exceção antes de passá-la para tratamento adicionais. Em o exemplo a seguir, um bloco de catch é usado para adicionar uma entrada em um log de erros antes da lançar uma exceção.

    try
    {
        // Try to access a resource.
    }
    catch (System.UnauthorizedAccessException e)
    {
        // Call a custom error logging procedure.
        LogError(e);
        // Re-throw the error. 
        throw;     
    }
    

Blocos finally

Um bloco de finally permite que você para limpar as ações que são executadas em um bloco de try . Se estiver presente, o bloco de finally executa o último, após o bloco de try e qualquer bloco correspondente de catch . Um bloco de finally sempre executa, independentemente se uma exceção é lançada ou um bloco de catch que corresponde ao tipo de exceção será localizado.

O bloco de finally pode ser usado para liberar recursos como fluxos de arquivo, conexões de banco de dados, e alças de elementos gráficos sem esperar o coletor de lixo em tempo de execução para finalizar os objetos. Consulte Instrução using (Referência de C#) para maiores informações.

Em o exemplo, o bloco de finally é usado para fechar um arquivo que é aberto no bloco de try . Observe que o estado do identificador de arquivo é verificado antes que o arquivo está fechado. Se o bloco de try não pode abrir o arquivo, o identificador de arquivo ainda tem o valor null e o bloco de finally não tenta feche-o. Como alternativa, se o arquivo está aberto com êxito no bloco de try , o bloco de finally fecha o arquivo aberto.

System.IO.FileStream file = null;
System.IO.FileInfo fileinfo = new System.IO.FileInfo("C:\\file.txt");
try
{
    file = fileinfo.OpenWrite();
    file.WriteByte(0xF);
}
finally
{
    // Check for null because OpenWrite might have failed. 
    if (file != null)
    {
        file.Close();
    }
}

Especificação da linguagem C#

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

Consulte também

Referência

Exceções e manipulação de exceções (Guia de Programação em C#)

try-catch (Referência de C#)

try-finally (Referência de C#)

try-catch-finally (Referência de C#)

Instrução using (Referência de C#)

Conceitos

Guia de Programação em C#

Outros recursos

Referência de C#