Tempo de tratamento de exceções: um resumo
Um manipulador de término é executado não importa como o bloco de instruções __try é terminado. Entre as causas estão: saltar para fora do bloco __try, uma instrução longjmp que transfere o controle para fora do bloco e desenrolar a pilha devido à manipulação de exceções.
Dica
O Visual C++ oferece suporte a dois formatos das instruções setjmp e longjmp.A versão rápida ignora a manipulação de término, mas é mais eficiente.Para usar essa versão, inclua o arquivo SETJMP.H.A outra versão oferece suporte à manipulação de término conforme descrito no parágrafo anterior.Para usar essa 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 término na ordem apropriada antes que qualquer outro código possa ser executado, incluindo o corpo de um manipulador de exceção.
Quando a causa da interrupção é uma exceção, o sistema deve primeiro executar a parte de filtro de um ou mais manipuladores de exceções antes de decidir o que terminar. A ordem de eventos é:
Uma exceção é acionada.
O sistema verifica a hierarquia dos manipuladores de exceções ativas e executa o filtro do manipulador com a precedência mais alta, ou seja, o manipulador de exceção instalado mais recentemente e aninhado mais profundamente, em termos de blocos e chamadas de funções.
Se esse filtro passar o controle (retornar 0), o processo continuará até que seja encontrado um filtro que não passe o controle.
Se esse filtro retornar –1, a execução continuará onde a exceção foi acionada, e não ocorrerá término.
Se o filtro retornar 1, ocorrerão os seguintes eventos:
O sistema desenrola a pilha, limpando todos os quadros de pilha entre o código atualmente em execução (onde a exceção foi acionada) e o quadro de pilha que contém o manipulador de exceção que está recebendo o controle.
À medida que a pilha é desenrolada, cada manipulador de término na pilha é executado.
O próprio manipulador de exceção é executado.
O controle passa para a linha de código após o final desse manipulador de exceção.