Compartilhar via


Instrução try-finally

Específicos do Microsoft

A sintaxe a seguir descreve o try-finally instrução:

__try {
   // guarded code
}
__finally {
   // termination code
}

Gramática

  • try-finally-instrução:
    __try instrução de compostos

    __finally instrução de compostos

O try-finally a declaração é uma extensão Microsoft para linguagens c e C++ que permite que aplicativos de destino garantir a execução de código de limpeza quando a execução de um bloco de código for interrompida.Limpeza consiste em tarefas como a desalocação de memória, fechando arquivos e liberando os identificadores de arquivo.O try-finally instrução é especialmente útil para retornam de rotinas que têm vários lugares onde uma verificação é feita para um erro que poderia causar prematura da rotina.

Para obter informações relacionadas e um exemplo de código, consulte tente-exceto a instrução.Para obter mais informações em geral de manipulação de exceção estruturada, consulte Structured Exception Handling.Para obter mais informações sobre a manipulação de exceções em aplicativos gerenciados, consulte Exception Handling sob /clr.

ObservaçãoObservação

Funciona com o Win32 o tratamento de arquivos de origem de c e C++ de exceção estruturada.No entanto, ele não é especificamente projetado para C++.Você pode garantir que seu código seja mais portátil usando o tratamento de exceções do C++.Além disso, o tratamento de exceção do C++ é mais flexível, que pode lidar com exceções de qualquer tipo.Para programas em C++, é recomendável que você use o mecanismo de tratamento de exceção do C++ (tente, catch e lançar instruções).

A instrução composta após o __try cláusula é a seção protegida.A instrução composta após o __finally cláusula é o manipulador de terminação.O manipulador Especifica um conjunto de ações executadas quando a seção protegida é finalizada, independentemente de se a seção protegida é encerrada por uma exceção (anormal) ou por falha padrão (término normal).

Controlar atinge um __try declaração de execução seqüencial simple (por meio de retorno).Quando insere um controle a __try, seu manipulador de associado se torna ativo.Se o fluxo de controle chega ao fim do bloco try, execução continuará da seguinte forma:

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

  2. Quando o manipulador de terminação é concluída, a execução continua após a __finally instrução.Independentemente da forma como o protegidos extremidades de seção (por exemplo, via um goto fora do corpo protegido ou uma return instrução), o manipulador de terminação é executado before o fluxo de controle se move da seção protegida.

    A __finally declaração não bloqueia procurando um manipulador de exceção apropriado.

Se ocorrer uma exceção na __try bloco, o sistema operacional deve encontrar um manipulador de exceção ou o programa falhará.Se um manipulador for encontrado, todos os __finally blocos são executados e a execução reinicia no manipulador.

Por exemplo, suponha que uma série de função chamadas links função a funcionar a D, conforme mostrado na figura a seguir.Cada função tem um manipulador de terminação.Se uma exceção é gerada na função d e manipulada na, manipuladores de terminação são chamados nesta ordem, como o sistema esvazia a pilha: D, C, b.

Ordem de execução do manipulador de terminação

Encerramento de ordem de execução do manipulador

ObservaçãoObservação

O comportamento de try-finally é diferente de outros idiomas que suportam o uso de Finalmente, como, por exemplo, C#.Um único __try pode ter, mas não ambos, da __finally e __except.Se ambos forem usados juntos, um externo tente-exceto a instrução deve incluir a instrução try-finally interna.As regras especificando quando cada bloco é executado também são diferentes.

A palavra-chave de __leave

O __leave palavra-chave só é válido dentro da seção protegida de um try-finally é a instrução e seu efeito saltar para o final da seção protegido.A execução continua na primeira instrução no manipulador de terminação.

A goto declaração também pode saltar da seção protegida, mas ela degrada o desempenho porque ele invoca o desenrolamento de pilha.O __leave instrução é mais eficiente, porque ele não causa desenrolamento de pilha.

Anormal

Sair de um try-finally usando a instrução a longjmp a função de tempo de execução é considerada anormal.É ilegal para saltar para uma __try instrução, mas legal para saltar para fora de um.Todos os __finally instruções que estão ativas entre o ponto de partida (rescisão normal a __try bloco) e o destino (o __except bloco que manipula a exceção) deve ser executado.Isso é chamado um desenrolamento local.

Se um tente bloco é encerrado prematuramente por qualquer razão, incluindo um salto para fora do bloco, o sistema executa os associados Finalmente bloco como parte do processo de desenrolar a pilha.Em tais casos, o AbnormalTermination função retorna VERDADEIRO se chamado de dentro do Finalmente bloquear; Caso contrário, retorna FALSE.

O manipulador de terminação não denomina-se um processo é eliminado no meio da execução de um try-finally instrução.

Específicos do Microsoft final

Consulte também

Referência

Escrever um manipulador de terminação

(C++) de manipulação de exceção estruturada

Palavras-chave C++

Termination-Handler Syntax