Compartilhar via


Tratamento de exceções baseado em quadro

Um manipulador de exceção baseado em quadro permite que você lide com a possibilidade de que uma exceção possa ocorrer em uma determinada sequência de código. Um manipulador de exceção baseado em quadro consiste nos seguintes elementos.

  • Um corpo de código protegido
  • Uma expressão de filtro
  • Um bloco de manipulador de exceções

Os manipuladores de exceção baseados em quadro são declarados na sintaxe específica do idioma. Por exemplo, no Microsoft C/C++ otimizando compilador, eles são implementados usando __try e __except. Para obter mais informações, consulte Sintaxe do manipulador.

O corpo protegido do código é um conjunto de uma ou mais instruções para as quais a expressão de filtro e o bloco de manipulador de exceções fornecem proteção de manipulação de exceções. O corpo protegido pode ser um bloco de código, um conjunto de blocos aninhados ou um procedimento ou função inteira. Usando o Microsoft C/C++ Optimizing Compiler, um corpo protegido é delimitado por chaves ({}) após a palavra-chave __try .

A expressão de filtro de um manipulador de exceção baseado em quadro é uma expressão que é avaliada pelo sistema quando ocorre uma exceção dentro do corpo protegido. Essa avaliação resulta em uma das seguintes ações do sistema.

  • O sistema interrompe sua busca por um manipulador de exceções, restaura o estado da máquina e continua a execução do thread no ponto em que a exceção ocorreu.
  • O sistema continua sua busca por um manipulador de exceções.
  • O sistema transfere o controle para o manipulador de exceções e a execução do thread continua sequencialmente no quadro de pilha no qual o manipulador de exceção é encontrado. Se o manipulador não estiver no quadro de pilha no qual a exceção ocorreu, o sistema desenrolará a pilha, deixando o quadro de pilha atual e quaisquer outros quadros de pilha até que ele volte ao quadro de pilha do manipulador de exceção. Antes que um manipulador de exceção seja executado, os manipuladores de terminação são executados para quaisquer corpos protegidos de código que terminaram como resultado da transferência de controle para o manipulador de exceções. Para obter mais informações sobre manipuladores de terminação, consulte Tratamento de terminação.

A expressão de filtro pode ser uma expressão simples ou pode invocar uma função de filtro que tenta manipular a exceção. Você pode chamar as funções GetExceptionCode e GetExceptionInformation de dentro de uma expressão de filtro para obter informações sobre a exceção que está sendo filtrada. GetExceptionCode retorna um código que identifica o tipo de exceção e GetExceptionInformation retorna um ponteiro para uma estrutura EXCEPTION_POINTERS que contém ponteiros para CONTEXT e estruturas EXCEPTION_RECORD.

Essas funções não podem ser chamadas de dentro de uma função de filtro, mas seus valores de retorno podem ser passados como parâmetros para uma função de filtro. GetExceptionCode pode ser usado dentro do bloco de manipulador de exceções, mas GetExceptionInformation não pode porque as informações para as quais ele aponta normalmente estão na pilha e são destruídas quando o controle é transferido para um manipulador de exceções. No entanto, um aplicativo pode copiar as informações para o armazenamento seguro para disponibilizá-las ao manipulador de exceções.

A vantagem de uma função de filtro é que ela pode manipular uma exceção e retornar um valor que faz com que o sistema continue a execução a partir do ponto em que a exceção ocorreu. Com um bloco de manipulador de exceções, por outro lado, a execução continua sequencialmente a partir do manipulador de exceções e não do ponto da exceção.

Lidar com uma exceção pode ser tão simples quanto observar um erro e definir um sinalizador que será examinado posteriormente, imprimir um aviso ou mensagem de erro ou executar alguma outra ação limitada. Se a execução puder ser continuada, também pode ser necessário alterar o estado da máquina modificando o registro de contexto. Para obter um exemplo de uma função de filtro que manipula uma exceção de falha de página, consulte Usando as funções de memória virtual.

A função UnhandledExceptionFilter pode ser usada como uma função de filtro em uma expressão de filtro. Ele retorna EXCEPTION_EXECUTE_HANDLER a menos que o processo esteja sendo depurado, caso em que ele retorna EXCEPTION_CONTINUE_SEARCH.