try-except (Instrucción) (C)
Específico de Microsoft
La instrucción try-except
es una extensión de Microsoft para el lenguaje C que permite a las aplicaciones obtener el control de un programa cuando se producen los eventos que normalmente finalizan la ejecución de un programa. Estos eventos se denominan excepciones y el mecanismo que se encarga de las excepciones se denomina control de excepciones estructurado.
Las excepciones pueden estar basadas en hardware o en software. Aunque las aplicaciones no pueden recuperarse completamente de las excepciones de hardware o software, el control de excepciones estructurado permite registrar y mostrar información sobre errores. Resulta útil para capturar el estado interno de la aplicación para ayudar a diagnosticar el problema. En concreto, para problemas intermitentes que no son fáciles de reproducir.
Sintaxis
try-except-statement
:
__try
compound-statement
__except (
expression
)
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 __except
es el controlador de excepciones. El controlador especifica un conjunto de acciones que se realizarán si se inicia una excepción durante la ejecución de la sección protegida. La ejecución continúa de la siguiente manera:
Se ejecuta la sección protegida.
Si no se produce ninguna excepción durante la ejecución de la sección protegida, continúa la ejecución de la instrucción después de la cláusula
__except
.Si se produce una excepción durante la ejecución de la sección protegida o en cualquier rutina a la que llame la sección protegida, se evalúa la expresión
__except
y el valor devuelto determina cómo se controla la excepción. Hay tres valores posibles:EXCEPTION_CONTINUE_SEARCH
: no se reconoce la excepción. La búsqueda de un controlador continúa hacia la parte superior de la pila, primero con las instruccionestry-except
contenedoras y, después, con los controladores siguientes que tengan mayor prioridad.EXCEPTION_CONTINUE_EXECUTION
: la excepción se reconoce, pero se descarta. La ejecución continúa en el punto donde se ha producido la excepción.EXCEPTION_EXECUTE_HANDLER
: la excepción se reconoce. El control se transfiere al controlador de excepciones ejecutando la instrucción compuesta__except
, después la ejecución continúa en el punto donde se produjo la excepción.
Dado que la expresión __except
se evalúa como expresión de C, se limita a un valor único: el operador de expresión condicional u operador de coma. Si se requiere un mayor procesamiento, la expresión puede llamar a una rutina que devuelva uno de los tres valores enumerados anteriormente.
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++ .
Cada rutina de una aplicación puede tener su propio controlador de excepciones. La expresión __except
se ejecuta en el ámbito del cuerpo de __try
. Es decir, tiene acceso a cualquier variable local declarada allí.
La palabra clave __leave
es válida dentro de un bloque de instrucciones try-except
. El efecto de __leave
es saltar al final del bloque try-except
. La ejecución se reanuda después del final del controlador de excepciones. 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.
La salida de una instrucción try-except
mediante el uso de la función en tiempo de ejecución longjmp
se considera una finalización anómala. No es válido saltar dentro de una instrucción __try
, pero sí fuera. No se llama al controlador de excepciones si un proceso se elimina en medio de la ejecución de una instrucción try-except
.
Ejemplo
A continuación se muestra un ejemplo de un controlador de excepciones y un controlador de terminación. Para obtener más información sobre los controladores de terminación, consulte la instrucción try-finally
(C).
.
.
.
puts("hello");
__try {
puts("in try");
__try {
puts("in try");
RAISE_AN_EXCEPTION();
} __finally {
puts("in finally");
}
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
puts("in except");
}
puts("world");
Este es el resultado del ejemplo, con el comentario agregado a la derecha:
hello
in try /* fall into try */
in try /* fall into nested try */
in filter /* execute filter; returns 1 so accept */
in finally /* unwind nested finally */
in except /* transfer control to selected handler */
world /* flow out of handler */
FIN de Específicos de Microsoft