Compartilhar via


Tempo de tratamento de exceção: um resumo

Um manipulador de terminação é executado independentemente de como o __try bloco de instrução é encerrado.Causas incluem saltar da __try bloco, um longjmp instrução que transfere o controle de bloco e desenrolar a pilha devido à manipulação de exceção.

ObservaçãoObservação

Visual C++ dá suporte a duas formas do setjmp e longjmp instruções.A versão rápida ignora o tratamento de terminação, mas é mais eficiente.Para utilizar esta versão, inclua o arquivo SETJMP.H.A outra versão suporta tratamento de terminação, conforme descrito no parágrafo anterior.Para utilizar esta versão, inclua o arquivo SETJMPEX.H.O aumento no desempenho da versão rápida depende da configuração de hardware.

O sistema operacional executa todos os manipuladores de terminação na ordem apropriada antes de qualquer outro código pode ser executado, incluindo o corpo de um manipulador de exceção.

Quando a causa interrupção é uma exceção, o sistema deve executar primeiro a parte do filtro de um ou mais manipuladores de exceção antes de decidir o que deve ser encerrado.A ordem de eventos é:

  1. Uma exceção é gerada.

  2. O sistema examina a hierarquia de manipuladores de exceção ativo e executa o filtro do manipulador com prioridade mais alta; Este é o manipulador de exceção mais recentemente instalado e mais profundamente aninhadas, em termos de blocos e chamadas de função.

  3. Se esse filtro passa o controle (retorna 0), o processo continua até encontra um filtro que não passa o controle.

  4. Se esse filtro retorna – 1, a execução continua onde a exceção foi gerada e nenhum encerramento ocorre.

  5. Se o filtro retorna 1, os seguintes eventos ocorrem:

    • O sistema esvazia a pilha, limpando todos os quadros de pilha entre o código atualmente em execução (onde a exceção foi gerada) e o quadro de pilha que contém o manipulador de exceção, obtendo controle.

    • Como a pilha é organizada, cada manipulador de terminação na pilha é executado.

    • O manipulador de exceção propriamente dito é executado.

    • Passa o controle para a linha de código após o término desse manipulador de exceção.

Consulte também

Referência

Escrever um manipulador de terminação

(C++) de manipulação de exceção estruturada