Tente-exceto instrução (C)
Específicos do Microsoft
O tente-exceto a declaração é uma extensão Microsoft para a linguagem c que permite que aplicativos assumir o controle de um programa quando ocorrem eventos que normalmente finalizar a execução.Tais eventos são chamados de exceções e o mecanismo que lida com exceções é chamado de manipulação de exceção estruturada.
Exceções podem ser qualquer hardware ou software-baseada.Mesmo quando os aplicativos não é possível recuperar completamente as exceções de hardware ou software, manipulação de exceção estruturada torna possível exibir informações de erro e o estado interno do aplicativo para ajudar a diagnosticar o problema de trapping.Isso é especialmente útil para problemas intermitentes que não podem ser reproduzidos com facilidade.
Sintaxe
exceto instrução try:
__try declaração de compostos__except ( expressão ) declaração de compostos
A instrução composta após o __try cláusula é a seção protegida.A instrução composta após o __except cláusula é o manipulador de exceção.O manipulador Especifica um conjunto de ações a serem tomadas se uma exceção é gerada durante a execução da seção protegida.Execução ocorre da seguinte maneira:
A seção protegida é executada.
Se nenhuma exceção ocorrer durante a execução da seção protegida, a execução continua com a instrução após a __except cláusula.
Se ocorre uma exceção durante a execução da seção protegida ou em qualquer rotina a seção protegida chama, o__except expressão é avaliada e o valor retornado determina como a exceção é tratada.Existem três valores:
EXCEPTION_CONTINUE_SEARCHExceção não é reconhecida.Continuar a procurar na pilha de um manipulador, primeiro contendo tente-exceto instruções, em seguida, para manipuladores com a próxima maior precedência.
EXCEPTION_CONTINUE_EXECUTIONExceção é reconhecida mas descartada.Continue a execução no ponto onde a exceção ocorreu.
EXCEPTION_EXECUTE_HANDLERExceção é reconhecida.Transferir o controle para o manipulador de exceção, executando o __except instrução composta, em seguida, continuar a execução no ponto em que ocorreu a exceção.
Porque o __except expressão é avaliada como uma expressão C, é limitado a um único valor, o operador condicional-expressão ou o operador de vírgula.Se for necessário o processamento mais abrangente, a expressão pode chamar uma rotina que retorna um dos três valores listados acima.
Observação |
---|
Manipulação de exceção estruturada trabalha com arquivos de código-fonte c e C++.No entanto, ele não é especificamente projetado para C++.Você pode garantir que seu código seja mais portátil usando o tratamento de exceções do C++.Além disso, a mecanismo de tratamento de exceção do C++ é muito mais flexível, que pode lidar com exceções de qualquer tipo. |
Observação |
---|
Para programas em C++, manipulação de exceção de C++ deve ser usada em vez de manipulação de exceção estruturada.Para obter mais informações, consulte Exception Handling na Referência da linguagem C++. |
Cada rotina em um aplicativo pode ter seu próprio manipulador de exceção.O __except expressão é executada no escopo do __try corpo.Isso significa que ele tem acesso a qualquer variável local declarada lá.
O __leave palavra-chave é válido dentro de um tente-exceto bloco de declaração.O efeito de __leave é ir até o final da tente-exceto bloco.A execução reinicia após o final do manipulador de exceção.Embora um goto declaração pode ser usada para obter o mesmo resultado, um goto instrução faz com que o desenrolamento de pilha.O __leave instrução é mais eficiente, porque ela não envolve o desenrolamento de pilha.
Saindo um tente-exceto usando a instrução a longjmp a função de tempo de execução é considerada anormal.É ilegal para saltar para uma __try instrução, mas legal para saltar para fora de um.O manipulador de exceção não é chamado, se um processo é eliminado no meio da execução de um tente-exceto instrução.
Exemplo
Veja a seguir um exemplo de um manipulador de exceção e um manipulador de terminação.Consulte A instrução try-finally para obter mais informações sobre os manipuladores de terminação.
.
.
.
puts("hello");
__try{
puts("in try");
__try{
puts("in try");
RAISE_AN_EXCEPTION();
}__finally{
puts("in finally");
}
}__except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ){
puts("in except");
}
puts("world");
Esta é a saída do exemplo, com comentários adicionados à direita:
hello
in try /* fall into try */
in try /* fall into nested try */
in filter /* execute filter; returns 1 so accept */
in finally /* unwind nested finally */
in except /* transfer control to selected handler */
world /* flow out of handler */
Específicos do Microsoft final