Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Específico da Microsoft
A try-except instrução é uma extensão da Microsoft para a linguagem C que permite que os aplicativos obtenham o controle de um programa quando eventos que normalmente encerram a execução ocorrem. Esses eventos são chamados de exceções e o mecanismo que lida com exceções é chamado de tratamento estruturado de exceções.
As exceções podem ser baseadas em hardware ou software. Mesmo quando os aplicativos não podem se recuperar completamente de exceções de hardware ou software, o tratamento estruturado de exceções possibilita registrar e exibir informações de erro. É útil capturar o estado interno do aplicativo para ajudar a diagnosticar o problema. Em particular, é útil para problemas intermitentes que não são fáceis de reproduzir.
Sintaxe
try-except-statement:
__trycompound-statement__except (expression)compound-statement
A instrução composta após a __try cláusula é a seção protegida. A instrução composta após a __except cláusula é o manipulador de exceção. O manipulador especifica um conjunto de ações a serem executadas se uma exceção for gerada durante a execução da seção protegida. A execução prossegue da seguinte maneira:
A seção protegida é executada.
Se nenhuma exceção ocorrer durante a execução da seção protegida, a execução continuará na instrução após a
__exceptcláusula.Se ocorrer uma exceção durante a execução da seção protegida ou em qualquer rotina que a seção protegida chamar, a
__exceptexpressão será avaliada. O valor retornado determina como a exceção é tratada. Há três valores possíveis:EXCEPTION_CONTINUE_SEARCH: a exceção não é reconhecida. Continue pesquisandotry-exceptna pilha por um manipulador, primeiro para conter instruções e, em seguida, para manipuladores com a próxima precedência mais alta.EXCEPTION_CONTINUE_EXECUTION: a exceção é reconhecida, mas descartada. Continue a execução no ponto em que a exceção ocorreu.EXCEPTION_EXECUTE_HANDLERA exceção é reconhecida. Transfira o controle para o manipulador de exceção executando a__exceptinstrução composta e, em seguida, continue a execução no ponto em que a exceção ocorreu.
Como a __except expressão é avaliada como uma expressão C, ela é limitada a um único valor, ao operador de expressão condicional ou ao operador de vírgula. Se for necessário um processamento mais extenso, a expressão poderá chamar uma rotina que retorna um dos três valores listados acima.
Observação
O tratamento de exceções estruturados funciona com arquivos de origem C e C++. No entanto, ele não foi projetado especificamente para C++. Para programas C++ portáteis, o tratamento de exceções do C++ deve ser usado em vez de tratamento de exceção estruturado. Além disso, o mecanismo de tratamento de exceções do C++ é muito mais flexível, pois pode lidar com exceções de qualquer tipo. Para obter mais informações, consulte Tratamento de exceção na Referência de Linguagem C++.
Cada rotina em um aplicativo pode ter seu próprio manipulador de exceção. A __except expressão é executada no escopo do __try corpo. Ele tem acesso a todas as variáveis locais declaradas lá.
A __leave palavra-chave é válida em um try-except bloco de instrução. O efeito é __leave ir para o final do try-except bloco. A execução é retomada após o fim do manipulador de exceção. Embora uma goto instrução possa ser usada para realizar o mesmo resultado, uma goto instrução causa desenrolamento de pilha. A __leave instrução é mais eficiente porque não envolve desenrolamento de pilha.
Sair de uma try-except instrução usando a longjmp função em tempo de execução é considerado encerramento anormal. Não é legal entrar em uma __try declaração, mas é legal pular de um. O manipulador de exceção não será chamado se um processo for encerrado no meio da execução de uma try-except instrução.
Exemplo
Aqui está um exemplo de um manipulador de exceção e um manipulador de terminação. Para obter mais informações sobre manipuladores de terminação, consulte try-finally a instrução (C).
.
.
.
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");
Aqui está 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 */
END específico da Microsoft