Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Um manipulador de exceções baseado em frame permite que você gerencie a possibilidade de uma exceção 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 manipulador de exceções
Os manipuladores de exceção baseados em quadros são declarados em sintaxe específica do idioma. Por exemplo, no Microsoft C/C++ Optimizing Compiler, eles são implementados usando __try e __except. Para obter mais informações, consulte Handler Syntax.
O corpo de código protegido é um conjunto de uma ou mais instruções para as quais a expressão de filtro e o bloco manipulador de exceções fornecem proteção de tratamento de exceções. O corpo protegido pode ser um bloco de código, um conjunto de blocos aninhados ou um procedimento ou função inteiro. Usando o compilador otimizador Microsoft C/C++, um corpo protegido é delimitado por chavetas ({}) seguindo a palavra-chave __try.
A expressão de filtro de um manipulador de exceção baseado em frame é uma expressão que é avaliada pelo sistema quando ocorre uma exceção dentro do bloco protegido. Esta avaliação resulta numa 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 controlo para o manipulador de exceção e a execução do thread continua sequencialmente no frame de pilha onde o manipulador de exceção se encontra. 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 esteja de volta ao quadro de pilha do manipulador de exceções. Antes de um manipulador de exceção ser executado, são executados os manipuladores de terminação para quaisquer blocos de código protegidos que terminaram devido à transferência de controle para o manipulador de exceção. Para obter mais informações sobre manipuladores de terminação, consulte Termination Handling.
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 dentro de uma expressão de filtro para obter informações sobre a exceção que está a ser 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 EXCEPTION_RECORD estruturas.
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 de um 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 para o 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, em contraste, a execução continua sequencialmente a partir do manipulador de exceções em vez de continuar do ponto onde a exceção ocorreu.
Lidar com uma exceção pode ser tão simples quanto anotar um erro e definir um sinalizador que será examinado posteriormente, imprimir um aviso ou mensagem de erro ou tomar 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 lida com 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 a 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 retorna EXCEPTION_CONTINUE_SEARCH.