Partilhar via


Instrução try-except (C)

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 ocorrem eventos que normalmente encerram a execução. 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 torna possível registrar e exibir informações de erro. É útil intercetar 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:
__try compound-statement __except ( expression ) compound-statement

A declaraçã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 processa-se da seguinte forma:

  1. A seção vigiada é executada.

  2. Se nenhuma exceção ocorrer durante a execução da seção guardada, a execução continua na instrução após a __except cláusula.

  3. Se ocorrer uma exceção durante a execução da seção protegida, ou em qualquer rotina que a seção protegida chama, a __except expressão será avaliada. O valor retornado determina como a exceção é tratada. Existem três valores possíveis:

    • EXCEPTION_CONTINUE_SEARCH: A exceção não é reconhecida. Continue a pesquisar na pilha por um manipulador, primeiro por instruções contendo try-except e, em seguida, por manipuladores com a próxima precedência mais alta.

    • EXCEPTION_CONTINUE_EXECUTION: A exceção é reconhecida, mas rejeitada. Continue a execução no ponto em que a exceção ocorreu.

    • EXCEPTION_EXECUTE_HANDLER A exceção é reconhecida. Transfira o controle para o manipulador de exceções executando a __except instruçã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, o operador de expressão condicional ou o operador de vírgula. Se for necessário um processamento mais extenso, a expressão pode chamar uma rotina que retorna um dos três valores listados acima.

Observação

O tratamento estruturado de exceções 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 C++ deve ser usado em vez do tratamento estruturado de exceções. Além disso, o mecanismo de tratamento de exceções C++ é muito mais flexível, na medida em que pode lidar com exceções de qualquer tipo. Para obter mais informações, consulte Tratamento de exceções na Referência de linguagem C++.

Cada rotina em um aplicativo pode ter seu próprio manipulador de exceções. A __except expressão é executada no âmbito do __try corpo. Tem acesso a quaisquer variáveis locais aí declaradas.

A __leave palavra-chave é válida dentro de um bloco de try-except instrução. O efeito de __leave é saltar para o final do try-except bloco. A execução é retomada após o fim do manipulador de exceções. Embora uma goto instrução possa ser usada para obter o mesmo resultado, uma goto instrução causa o desenrolamento da 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 de tempo de execução é considerado término anormal. Não é legal saltar para uma __try declaração, mas é legal saltar de uma. O manipulador de exceção não é chamado se um processo for morto 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 a try-finally 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

Ver também

try-except instrução (C++)