Compartilhar via


instrução try-finally (C)

Específico da Microsoft

A try-finally instrução é uma extensão da Microsoft para a linguagem C que permite que os aplicativos garantam a execução do código de limpeza quando a execução de um bloco de código é interrompida. A limpeza consiste em tarefas como desalocar memória, fechar arquivos e liberar identificadores de arquivo. A try-finally instrução é especialmente útil para rotinas que têm vários locais onde uma verificação é feita para um erro que pode causar retorno prematuro da rotina.

try-finally-statement:
__try compound-statement __finally compound-statement

A instrução composta após a __try cláusula é a seção protegida. A instrução composta após a __finally cláusula é o manipulador de terminação. O manipulador especifica um conjunto de ações que são executadas quando a seção protegida é encerrada. Não importa se a seção protegida é encerrada por uma exceção (terminação anormal) ou por fall through padrão (término normal).

O controle atinge uma __try instrução por execução sequencial simples (fall through). Quando o controle insere a __try instrução, seu manipulador associado fica ativo. A execução prossegue da seguinte maneira:

  1. A seção protegida é executada.

  2. O manipulador de terminação é invocado.

  3. Quando o manipulador de terminação for concluído, a execução continuará após a __finally instrução. Não importa como a seção protegida termina (por exemplo, por meio de uma goto instrução fora do corpo protegido ou por meio de uma return instrução), o manipulador de terminação é executado antes que o fluxo de controle saia da seção protegida.

A __leave palavra-chave é válida em um try-finally bloco de instrução. O efeito é __leave ir para o final do try-finally bloco. O manipulador de terminação é executado imediatamente. 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-finally instrução usando uma return instrução ou a longjmp função de tempo de execução é considerado encerramento anormal. Não é legal entrar em uma __try declaração, mas legal pular de uma. Todas as __finally instruções que estão ativas entre o ponto de partida e o destino devem ser executadas. Chama-se desenrolamento local.

O manipulador de terminação não será chamado se um processo for encerrado durante a execução de uma try-finally instrução.

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

Veja o exemplo da try-except instrução para ver como a try-finally instrução funciona.

END específico da Microsoft

Consulte também

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