Control de excepciones basado en fotogramas
Un controlador de excepciones basado en fotogramas permite tratar con la posibilidad de que se produzca una excepción en una determinada secuencia de código. Un controlador de excepciones basado en fotogramas consta de los siguientes elementos.
- Un cuerpo protegido del código
- Expresión de filtro
- Un bloque de controlador de excepciones
Los controladores de excepciones basados en fotogramas se declaran en sintaxis específica del lenguaje. Por ejemplo, en el compilador de optimización de Microsoft C/C++, se implementan mediante __try y __except. Para obtener más información, vea Sintaxis del controlador.
El cuerpo protegido del código es un conjunto de una o varias instrucciones para las que la expresión de filtro y el bloque del controlador de excepciones proporcionan protección de control de excepciones. El cuerpo protegido puede ser un bloque de código, un conjunto de bloques anidados o un procedimiento o función completos. Con el compilador de optimización de Microsoft C/C++, un cuerpo protegido se incluye entre llaves ({}) después de la palabra clave __try .
La expresión de filtro de un controlador de excepciones basado en fotogramas es una expresión evaluada por el sistema cuando se produce una excepción en el cuerpo protegido. Esta evaluación da como resultado una de las siguientes acciones por parte del sistema.
- El sistema detiene su búsqueda de un controlador de excepciones, restaura el estado de la máquina y continúa la ejecución del subproceso en el punto en el que se produjo la excepción.
- El sistema continúa su búsqueda de un controlador de excepciones.
- El sistema transfiere el control al controlador de excepciones y la ejecución de subprocesos continúa secuencialmente en el marco de pila en el que se encuentra el controlador de excepciones. Si el controlador no está en el marco de pila en el que se produjo la excepción, el sistema desenreda la pila, dejando el marco de pila actual y cualquier otro fotograma de pila hasta que vuelva al marco de pila del controlador de excepciones. Antes de ejecutar un controlador de excepciones, los controladores de terminación se ejecutan para cualquier cuerpo protegido de código que termine como resultado de la transferencia de control al controlador de excepciones. Para obtener más información sobre los controladores de terminación, consulte Control de terminación.
La expresión de filtro puede ser una expresión simple o puede invocar una función de filtro que intenta controlar la excepción. Puede llamar a las funciones GetExceptionCode y GetExceptionInformation desde una expresión de filtro para obtener información sobre la excepción que se está filtrando. GetExceptionCode devuelve un código que identifica el tipo de excepción y GetExceptionInformation devuelve un puntero a una estructura de EXCEPTION_POINTERS que contiene punteros a las estructuras CONTEXT y EXCEPTION_RECORD .
Estas funciones no se pueden llamar desde dentro de una función de filtro, pero sus valores devueltos se pueden pasar como parámetros a una función de filtro. GetExceptionCode se puede usar dentro del bloque del controlador de excepciones, pero GetExceptionInformation no puede deberse a que la información a la que apunta suele estar en la pila y se destruye cuando el control se transfiere a un controlador de excepciones. Sin embargo, una aplicación puede copiar la información en un almacenamiento seguro para que esté disponible para el controlador de excepciones.
La ventaja de una función de filtro es que puede controlar una excepción y devolver un valor que hace que el sistema continúe la ejecución desde el punto en el que se produjo la excepción. Con un bloque de controlador de excepciones, en cambio, la ejecución continúa secuencialmente desde el controlador de excepciones en lugar del punto de la excepción.
Controlar una excepción puede ser tan simple como anotar un error y establecer una marca que se examinará más adelante, imprimir una advertencia o un mensaje de error, o realizar alguna otra acción limitada. Si se puede continuar la ejecución, también puede ser necesario cambiar el estado de la máquina modificando el registro de contexto. Para obtener un ejemplo de una función de filtro que controla una excepción de error de página, consulte Uso de las funciones de memoria virtual.
La función UnhandledExceptionFilter se puede usar como función de filtro en una expresión de filtro. Devuelve EXCEPTION_EXECUTE_HANDLER a menos que se esté depurando el proceso, en cuyo caso devuelve EXCEPTION_CONTINUE_SEARCH.