try-finally (Instrucción) (C)

Específico de Microsoft

La instrucción try-finally es una extensión de Microsoft al lenguaje C que permite que las aplicaciones garanticen la ejecución del código de limpieza cuando se interrumpe la ejecución de un bloque de código. La limpieza consta de tareas como desasignar memoria, cerrar archivos y liberar identificadores de archivo. La instrucción try-finally es especialmente útil para las rutinas que tienen varios lugares donde comprobar un error, lo que puede causar que la rutina termine antes de tiempo.

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

La instrucción compuesta detrás de la cláusula __try es la sección protegida. La instrucción compuesta detrás de la cláusula __finally es el controlador de terminación. El controlador especifica un conjunto de acciones que se ejecutan cuando se sale de la sección protegida, tanto si se sale de esta sección por una excepción (terminación anómala) o después de pasar por ella (terminación normal).

El control llega a una instrucción __try mediante la ejecución secuencial simple (paso explícito). Cuando el control entra en la instrucción __try, su controlador asociado se activa. La ejecución continúa de la siguiente manera:

  1. Se ejecuta la sección protegida.

  2. Se invoca al controlador de terminación.

  3. Cuando el controlador de terminación finaliza, la ejecución continúa después de la instrucción __finally. Independientemente de cómo finalice la sección protegida (por ejemplo, mediante una instrucción goto fuera del cuerpo protegido o a través de una instrucción return ), el controlador de terminación se ejecuta antes de que el flujo de control salga de la sección protegida.

La palabra clave __leave es válida dentro de un bloque de instrucciones try-finally. El efecto de __leave es saltar al final del bloque try-finally. El controlador de terminación se ejecuta inmediatamente. Aunque se puede utilizar una instrucción goto para lograr el mismo resultado, una instrucción goto produce el desenredado de la pila. La instrucción __leave es más eficaz porque no produce el desenredado de la pila.

Salir de una instrucción try-finally mediante una instrucción return o mediante la función de tiempo de ejecución longjmp se considera una terminación anómala. No es válido saltar dentro de una instrucción __try , pero sí fuera. Se deben ejecutar todas las instrucciones __finally activas entre el punto de salida y el destino. Esto recibe el nombre de desenredado local.

No se llama al controlador de terminación si un proceso se elimina mientras se ejecuta una instrucción try-finally.

Nota

El control estructurado de excepciones funciona con archivos de código fuente de C y C++. Sin embargo, no está diseñado específicamente para C++. Para los programas de C++ portables, se debe usar el control de excepciones de C++ en lugar del control estructurado de excepciones. Además, el mecanismo de control de excepciones de C++ es mucho más flexible, ya que puede controlar excepciones de cualquier tipo. Para obtener más información, vea Control de excepciones en la referencia del lenguaje C++ .

Consulte el ejemplo de la instrucción try-except para ver cómo funciona la instrucción try-finally.

FIN de Específicos de Microsoft

Consulte también

Instrucción try-finally (C++)