Partilhar via


Instrução try-except (C)

Específico da Microsoft

A instrução try-except é uma extensão da Microsoft para a linguagem C que permite que os aplicativos assumam o controle de um programa quando ocorrerem eventos que normalmente interrompem a execução. Esses eventos são denominados exceções, e o mecanismo que lida com exceções é chamado de manipulação de exceção estruturada.

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 de exceção estruturada possibilita registrar e exibir informações de erro. É útil capturar o estado interno do aplicativo para ajudar a diagnosticar o problema. É especialmente ú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 instrução composta após a cláusula __try é a seção protegida. A instrução composta após a cláusula __except é o manipulador de exceções. O manipulador especifica um conjunto de ações a ser executado se uma exceção for gerada durante a execução da seção protegida. A execução procede 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 continuará na instrução após a cláusula __except.

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

    • EXCEPTION_CONTINUE_SEARCH: A exceção não é reconhecida. Continue pesquisando manipuladores na pilha; primeiro os que contêm as instruções try-except, depois os que têm a próxima precedência mais alta.

    • EXCEPTION_CONTINUE_EXECUTION: a exceção é reconhecida, mas ignorada. Continue a execução no ponto onde ocorreu a exceção.

    • EXCEPTION_EXECUTE_HANDLER A exceção é reconhecida. Transfere o controle para o manipulador de exceção executando a instrução composta __except e continua a execução no ponto de execução da exceção.

Como a expressão __except é avaliada como uma expressão C, ela é limitada a um único valor, o operador de expressão condicional ou ao operador vírgula. Se um processamento mais extenso for necessário, a expressão poderá chamar uma rotina que retorne um dos três valores listados acima.

Observação

A manipulação de exceção estruturada funciona com arquivos de código-fonte em C e C++. No entanto, não é projetada especificamente para C++. Para programas C++ portáteis, deve ser usado o tratamento de exceção de C++ em vez do tratamento de exceções estruturado. Além disso, o mecanismo de tratamento de exceções de C++ é muito mais flexível, pois pode tratar exceções de qualquer tipo. Para obter mais informações, consulte Tratamento de exceções na Referência da linguagem C++.

Cada rotina em um aplicativo pode ter seu próprio manipulador de exceção. A expressão __except é executada no escopo do corpo de __try. Isso significa que ela tem acesso a todas as variáveis locais declarados lá.

A palavra-chave __leave é válida dentro de um bloco de instruções try-except. O efeito de __leave é ignorar ao final do bloco try-except. A execução é retomada após o término do manipulador de exceção. Embora uma instrução goto possa ser usada para alcançar o mesmo resultado, uma instrução goto causa o desenrolar da pilha. A instrução __leave é mais eficiente porque não envolve o desenrolar da pilha.

Sair de uma instrução try-except usando a função de tempo de execução longjmp é considerado um encerramento anormal. Não é permitido ir para uma instrução __try, mas é permitido sair de uma. O manipulador de exceção não é chamado se um processo é interrompido no meio da execução de uma instrução try-except.

Exemplo

O exemplo a seguir é um manipulador de exceções e um manipulador de término. Para obter mais informações sobre manipuladores de terminação, confira Instrução (C) try-finally.

.
.
.
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");

Este é o resultado do exemplo, com o comentário adicionado à 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                  */

FIM da seção específica da Microsoft

Confira também

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