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:
A seção protegida é executada.
O manipulador de término é invocado.
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çãogoto
fora do corpo protegido ou de uma instruçãoreturn
), 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-except
instrução para saber como a instrução try-finally
funciona.
FIM Específico da Microsoft