Partilhar via


declaraçã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 deslocalizar memória, fechar arquivos e liberar identificadores de arquivos. A try-finally declaração é especialmente útil para rotinas que têm vários lugares onde é feita uma verificação de um erro que pode causar retorno prematuro da rotina.

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

A declaraçã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 é abandonada por uma exceção (rescisão anormal) ou por queda padrão (término normal).

O controle alcança uma __try instrução por execução sequencial simples (fall through). Quando o controle insere a __try instrução, seu manipulador associado torna-se ativo. A execução processa-se da seguinte forma:

  1. A seção vigiada é executada.

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

  3. Quando o manipulador de rescisã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, através de uma goto declaração fora do corpo protegido ou através de uma return declaração), o manipulador de terminação é executado antes que o fluxo de controle se mova para fora da seção protegida.

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

O manipulador de rescisão não é chamado se um processo for morto durante a execução de uma try-finally instrução.

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

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

END específico da Microsoft

Ver também

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