Compartilhar via


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:

  1. A seção protegida é executada.

  2. 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.

  3. 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çãoObservaçã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çãoObservaçã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

Consulte também

Referência

Tente-exceto instrução