Visão Geral das Exceções

Uma exceção é qualquer condição de erro ou comportamento inesperado encontrado por um programa em execução.Exceções podem ser geradas por causa de uma falha em seu código ou no código que você chama (tal como uma biblioteca compartilhada), recursos indisponíveis do sistema operacional, condições inesperadas encontradas pela Common Language Runtime (como código que não pode ser verificado), e assim por diante.O seu aplicativo pode recuperar-se de algumas dessas condições, mas de outras não.Enquanto você pode recuperar-se da maioria das exceções de aplicativos, você não pode se recuperar da maioria das exceções de tempo de execução.

Na .NET Framework, uma exceção é um objeto que herda da classe Classe de Exceção.Uma exceção é lançada a partir de uma área de código onde ocorreu um problema.A exceção é passada à pilha até que o aplicativo a manipule ou encerre o programa.Para obter mais informações sobre o tratamento de exceções usando a .NET Framework, consulte o tópico Classe de Exceção.

Como o Tempo de Execução Gerencia as Exceções

O tempo de execução usa um modelo de manipulação de exceção baseado em objetos de exceção e blocos de código protegido.Um objeto Exception é criado para representar uma exceção quando ele ocorre.

O tempo de execução cria uma tabela de informações de exceção para cada arquivo executável.Cada método do executável tem uma matriz de informações de manipulação de exceção (que podem ser vazias) associada à tabela de informações de exceção.Cada entrada na matriz descreve um bloco de código protegido, quaisquer filtros de exceção associados à tais códigos, e quaisquer manipuladores de exceção (instruções catch).Esta tabela de exceção é extremamente eficiente e não há nenhuma penalidade de desempenho em tempo de processamento ou em uso de memória quando uma exceção não ocorrer.Você utiliza os recursos somente quando ocorre uma exceção.

A tabela de informações de exceção representa quatro tipos de manipuladores de exceção para blocos protegidos:

  • O manipulador finally, que executa sempre que o bloco termina, não interessando se isso ocorre pelo fluxo de controle normal ou por uma exceção sem-tratamento.

  • Um manipulador de falha, que deve executar se uma exceção ocorrer, mas não é executado na conclusão do fluxo de controle normal.

  • Um manipulador com filtro de tipo, que lida com qualquer exceção de uma classe especificada, ou qualquer uma de suas classes derivadas.

  • Um manipulador com filtro de usuário, que executa código especificado pelo usuário para determinar se a exceção deve ser manipulada pelo manipulador associado ou deve ser passada para o próximo bloco protegido.

Cada linguagem implementa esses manipuladores de exceção de acordo com as suas especificações.Por exemplo, Visual Basic 2005 fornece acesso ao manipulador com filtro de usuário através de uma variável de comparação (usando a palavra-chave When) na instrução catch; C# não implementa o manipulador com filtro de usuário.

Quando ocorre uma exceção, o tempo de execução começa um processo de duas etapas:

  1. O tempo de execução procura a matriz para o primeiro bloco protegido que:

    • Protege uma região que inclui a instrução atualmente em execução, e

    • Contém um manipulador de exceção ou contém um filtro que lida com a exceção.

  2. Se ocorrer uma correspondência, o tempo de execução cria um objeto Exception que descreve a exceção.O tempo de execução, em seguida, executa todas as instruções finally e instruções de falha entre a instrução na qual a exceção ocorreu e a instrução que está manipulando a exceção.Observe que a ordem dos manipuladores de exceção importante: o manipulador de exceção mais internos é avaliado primeiro.Observe também que manipuladores de exceção podem acessar as variáveis locais e a memória local da rotina que captura a exceção, mas quaisquer valores intermediários no momento que a exceção é lançada são perdidos.

    Se nenhuma correspondência ocorrer no método atual, o tempo de execução busca cada chamador do método atual, e ele continua este caminho pilha acima.Se nenhum chamador tiver uma correspondência, o tempo de execução permitirá que o depurador acesse a exceção.Se o depurador não anexar à exceção, o tempo de execução gera o evento UnhandledException.Se não houver nenhum ouvintes para o evento UnhandledException, o tempo de execução despeja um rastreamento de pilha e encerra o programa.

Filtrando Exceções de Tempo de Execução

Você pode filtrar as exceções que você detectar e manipulá-las, tanto pelo tipo, quanto por alguns critérios definidos pelo usuário.

Manipuladores com filtro de tipo manipulam um tipo determinado de exceção (ou classes derivadas dela).A forma mais comum de manipuladores de exceção com filtro de tipo especifica que somente uma determinada classe de exceção deve ser capturada.

O exemplo a seguir mostra um manipulador de exceção projetado para capturar uma exceção específica, neste caso a FileNotFoundException.

Catch e As FileNotFoundException
   Console.WriteLine("[Data File Missing] {0}", e)
catch(FileNotFoundException e) {
    Console.WriteLine("[Data File Missing] {0}", e);
}

Manipuladores de exceção filtradas pelo usuário capturam e tratam exceções com base nos requisitos que você definiu para a exceção.Esses manipuladores utilizam a instrução Catch com a palavra-chave When no Visual Basic 2005.Para obter detalhes sobre filtragem de exceções dessa maneira, consulte Usando Exceções Específicas em um Bloco Catch.

Consulte também

Conceitos

Classe Exception e suas Propriedades

Hierarquia de exceções

Práticas recomendadas para tratamento de exceções

Outros recursos

Fundamentos da Manipulação de Exceções

Tratamento e lançamento de exceções