instrucción try - final

Específicos de Microsoft

la sintaxis siguiente describe la instrucción de try-finally :

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

Gramática

  • intento-final-instrucción:
    instrucción compuesta de__try

    instrucción compuesta de__finally

La instrucción de try-finally es una extensión de Microsoft de los lenguajes c y C++ que permite a las aplicaciones de destino para garantizar la ejecución del código de limpieza cuando la ejecución de un bloque de código se interrumpe.Limpieza consta de las tareas como desasignando memoria, los archivos cerrados, y liberar los identificadores de archivos.La instrucción de try-finally es especialmente útil para las rutinas que tienen varios lugares donde una comprobación se crea para un error que puede causar retorno prematuro de la rutina.

Para obtener información relacionada y un ejemplo de código, vea intento-excepto la instrucción.Para obtener más información sobre el control de excepciones estructurado vea normalmente control de excepciones estructurado.Para obtener más información sobre cómo administrar las excepciones en las aplicaciones administradas, vea Control de excepciones con /clr.

[!NOTA]

El control estructurado de excepciones ejecuta Win32 para los archivos de código fuente de c y C++.Sin embargo, no está diseñado específicamente para C++.Puede asegurarse de que el código sea más portátil mediante el control de excepciones de C++.Además, el control de excepciones de C++ es más flexible, ya que puede controlar las excepciones de cualquier tipo.Para los programas de C++, se recomienda utilizar C++ control administra el mecanismo (instrucciones detry, catch, y captura ).

La instrucción compuesta después de la cláusula de __try es la sección guardada.la instrucción compuesta después de la cláusula de __finally es el controlador de terminación.El controlador especifica un conjunto de acciones que se ejecutan cuando se cierra la sección guardada, independientemente de la sección guardado sea salida por una excepción (terminación anormal), o por estándar fracase (finalización normal).

El Control alcanza una instrucción de __try por la ejecución secuencial simple (fracase).Cuando el control entra en __try, el controlador asociado hace activo.Si el flujo de control alcanza el final del bloque try, la ejecución continúa como sigue:

  1. Se invoca el controlador de terminación.

  2. cuando el controlador de terminación completa, la ejecución continúa después de la instrucción de __finally .Independientemente de cómo finaliza guardados de la sección (por ejemplo, mediante goto fuera del cuerpo guardado o una instrucción de return ), el controlador de terminación son before ejecutado el flujo de control se desplaza de la sección guardada.

    Una instrucción de __finally no bloquea buscar un controlador de excepciones adecuado.

Si se produce una excepción en el bloque de __try , el sistema operativo debe encontrar un controlador para la excepción o el programa producirá un error.Si se encuentra el controlador, se ejecutan cualquiera y todos los bloques de __finally y la ejecución se reanuda en el controlador.

Por ejemplo, suponga una serie de función A de los vínculos de las llamadas de función para trabajar d, como se muestra en la ilustración siguiente.cada función tiene un controlador de terminación.Si se genera una excepción en d de la función y se administra en A, los controladores de terminación en este orden mientras el sistema desenreda la pila: D, C, B.

Orden de ejecución de controlador de terminación

Controlador de terminación de pedido de ejecución

[!NOTA]

El comportamiento try-finally es diferente de otros lenguajes que admiten el uso de finally, como C#.solo __try puede tener cualquiera, pero no ambos, __finally y __except.Si fuese tanto a usar conjuntamente, un externo intento-excepto la instrucción debe agregar la instrucción interna try-finally.Las reglas que especifican cuando cada bloque se ejecuta también son diferentes.

La palabra clave __leave

La palabra clave de __leave solo es válida dentro de la sección guardada de una instrucción de try-finally , y su efecto es saltar al final de la sección guardada.Continúa la ejecución de la primera instrucción del controlador de terminación.

Una instrucción de goto también puede saltar de la sección guardada, pero degrada el rendimiento porque invoca desenredo de la pila.La instrucción de __leave es más eficaz porque no produce desenredo de la pila.

Terminación anormal

Realiza una instrucción de try-finally mediante la función en tiempo de ejecución de longjmp se considera terminación anormal.No es válido saltar en __try una instrucción, pero permite pasar de una.Todas las instrucciones de __finally activas entre el punto de salida (finalización normal de __try bloqueado) y el destino ( __except bloqueado que controla la excepción) se deben ejecutar.Esto se denomina un desenredo local.

Si un bloque de intento se termina prematuramente por cualquier razón, incluido un salto fuera de un bloque, el sistema ejecuta finally asociado bloqueado como parte del proceso desenredar la pila.En estos casos, la función de AbnormalTermination devuelve TRUE si se denomina dentro del bloque de finally ; de lo contrario, devuelve FALSE.

No se llama al controlador de terminación si un proceso se elimina en medio de ejecutar una instrucción de try-finally .

Específico de Microsoft de FINAL

Vea también

Referencia

Escribir un controlador de terminación

Control de excepciones estructurado (C++)

Palabras clave de C++

Termination-Handler Syntax