Escribir un filtro de Excepciones
Puede administrar una excepción saltar al nivel de controlador de excepciones o continuar la ejecución.En lugar de utilizar el código de controlador de excepciones para controlar la excepción y de fracasar, puede usar el filtro para limpiar el problema y después, cambiando – 1, reanudar el flujo normal sin borrar la pila.
[!NOTA]
algunas excepciones no pueden ser continuadas.Si evalúa el filtro – 1 para este tipo de excepción, el sistema inicia una nueva excepción.Cuando se llama a RaiseException, determina si la excepción continuará.
por ejemplo, el código siguiente utiliza una llamada de función en la expresión de filtro : esta función controla el problema y devuelve – 1 para reanudar el flujo de control normal:
// exceptions_Writing_an_Exception_Filter.cpp
#include <windows.h>
int main() {
int Eval_Exception( int );
__try {}
__except ( Eval_Exception( GetExceptionCode( ))) {
;
}
}
void ResetVars( int ) {}
int Eval_Exception ( int n_except ) {
if ( n_except != STATUS_INTEGER_OVERFLOW &&
n_except != STATUS_FLOAT_OVERFLOW ) // Pass on most exceptions
return EXCEPTION_CONTINUE_SEARCH;
// Execute some code to clean up problem
ResetVars( 0 ); // initializes data to 0
return EXCEPTION_CONTINUE_EXECUTION;
}
Es conveniente utilizar una llamada de función en la expresión de filtro siempre que el filtro necesite hacer nada complejo.La evaluación de la expresión cede la ejecución de la función, en este caso, Eval_Exception.
Observe el uso de GetExceptionCode de determinar la excepción.Debe llamar a esta función dentro de filtro propio.Eval_Exception no puede llamar a GetExceptionCode, pero debe tener el código de excepción pasa a.
Este controlador pasa el control a otro controlador a menos que la excepción es un entero o un desbordamiento flotante.Si es, el controlador llama a una función (ResetVars es un ejemplo, no una función API) para restablecer algunas variables globales.Statement-block-2, que en este ejemplo está vacío, nunca se puede ejecutar porque Eval_Exception nunca devuelve EXCEPTION_EXECUTE_HANDLER (1).
Mediante una llamada de función es una buena técnica de propósito general para trabajar con expresiones de filtro complejas.Otras dos características de lenguaje C útiles son:
el operador condicional
El operador de comas
El operador condicional suele ser útil, porque se puede utilizar para comprobar un código de retorno concreto y después para devolver uno de dos valores diferentes.Por ejemplo, el filtro en el código siguiente reconoce la excepción sólo si la excepción se STATUS_INTEGER_OVERFLOW:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0 ) {
El propósito del operador condicional en este caso es principalmente proporcionar claridad, porque el código siguiente genera los mismos resultados:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {
El operador condicional es más útil en las situaciones en las que desee el filtro para evaluar – 1, EXCEPTION_CONTINUE_EXECUTION.
El operador de comas permite realizar a varias, operaciones independientes en una sola expresión.El efecto es aproximadamente el de ejecutar varias instrucciones y después de devolver el valor de la última expresión.Por ejemplo, el código siguiente almacena el código de excepción en una variable y después la prueba:
__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )