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çã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 é:
Uma exceção é gerada.
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.
Se esse filtro passa o controle (retorna 0), o processo continua até encontra um filtro que não passa o controle.
Se esse filtro retorna – 1, a execução continua onde a exceção foi gerada e nenhum encerramento ocorre.
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.