Compartilhar via


Instrução try-finally (C)

Específico da Microsoft

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

try-finally-statement:
__try compound-statement __finally 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 __finally é o manipulador de término. 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 (encerramento anormal) ou por queda padrão (encerramento normal).

O controle atinge a instrução __try em uma execução sequencial simples (queda). Quando o controle entra na instrução __try, seu manipulador associado fica ativo. A execução procede da seguinte maneira:

  1. A seção protegida é executada.

  2. O manipulador de término é invocado.

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

A palavra-chave __leave é válida dentro de um bloco de instruções try-finally. O efeito de __leave é ignorar ao final do bloco try-finally. O manipulador de término é executado imediatamente. 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-finally usando uma instrução return ou 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. Todas as instruções __finally que são ativas entre o ponto de partida e o destino devem ser executadas. Isso se chama desenrolamento local.

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

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

Veja o exemplo da try-exceptinstrução para saber como a instrução try-finally funciona.

FIM Específico da Microsoft

Confira também

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