Información general sobre excepciones

Actualización: noviembre 2007

Una excepción es cualquier situación de error o comportamiento inesperado que encuentra un programa en ejecución. Las excepciones se pueden producir a causa de un error en el código o en código al que se llama (como una biblioteca compartida), que no estén disponibles recursos del sistema operativo, condiciones inesperadas que encuentra Common Language Runtime (por ejemplo, código que no se puede comprobar), etc. La aplicación se puede recuperar de algunas de estas condiciones, pero de otras no. Si bien es posible recuperarse de la mayoría de las excepciones de aplicación, no lo es de la mayoría de excepciones en tiempo de ejecución.

En .NET Framework, una excepción es un objeto derivado de la clase Exception. La excepción se produce en un área del código en que se produce un problema. La excepción asciende por la pila hasta que la aplicación la controla o el programa se detiene. Para obtener más información sobre el control de excepciones mediante .NET Framework, vea la clase Exception.

Cómo el motor en tiempo de ejecución administra excepciones

El tiempo de ejecución utiliza un modelo de control de excepciones basado en objetos de excepción y bloques de código protegidos. Cuando se produce una excepción, se crea un objeto Exception que la representa.

El tiempo de ejecución crea una tabla de información de excepciones para cada ejecutable. Cada método del ejecutable tiene una matriz de información de control de excepciones asociada (que puede estar vacía) en la tabla de información de excepciones. Cada entrada de la matriz describe un bloque de código protegido, los filtros de excepción asociados a ese código y los controladores de excepción (instrucciones Catch). Esta tabla de excepciones es muy eficiente y no supone una disminución del rendimiento en el tiempo del procesador ni en el uso de memoria si no se produce una excepción. Los recursos sólo se utilizan cuando se produce una excepción.

La tabla de información de excepciones representa cuatro tipos de controladores de excepciones para los bloques protegidos:

  • Un controlador Finally que se ejecuta cada vez que se cierra el bloque, tanto si se produce por el flujo de control normal como por una excepción no controlada.

  • Un controlador de errores que se debe ejecutar si se produce una excepción, pero no se ejecuta cuando termina el flujo de control normal.

  • Un controlador filtrado por el tipo que controla las excepciones de una clase especificada o de cualquiera de sus clases derivadas.

  • Un controlador filtrado por el usuario que ejecuta código especificado por el usuario para determinar si el controlador asociado debe controlar la excepción o si dicha excepción se debe pasar al siguiente bloque protegido.

Cada lenguaje implementa estos controladores de excepción según sus especificaciones. Por ejemplo, Visual Basic 2005 proporciona acceso al controlador filtrado por el usuario mediante una comparación de variables (con la palabra clave When) en la instrucción Catch; C# no implementa el controlador filtrado por el usuario.

Cuando se produce una excepción, el tiempo de ejecución inicia un proceso de dos pasos:

  1. El motor en tiempo de ejecución busca la matriz del primer bloque protegido que:

    • Protege una región que contiene la instrucción que se está ejecutando actualmente y

    • Contiene un controlador de excepciones o un filtro que controla la excepción.

  2. Si hay una coincidencia, el tiempo de ejecución crea un objeto Exception que describe la excepción. A continuación, el tiempo de ejecución ejecuta todas las instrucciones Finally o de error entre la instrucción en la que se produjo la excepción y la instrucción que controla la excepción. Tenga en cuenta que el orden de los controladores de excepción es importante: primero se evalúa la excepción situada más al interior. Tenga en cuenta también que los controladores de excepciones pueden tener acceso a las variables locales y a la memoria local de la rutina que detecta la excepción, pero se pierden los valores intermedios del momento en que se produce la excepción.

    Si no hay ninguna coincidencia en el método actual, el tiempo de ejecución busca en todos los llamadores del método actual y va subiendo hasta recorrer toda la pila. Si ningún llamador tiene una coincidencia, el tiempo de ejecución permite que el depurador tenga acceso a la excepción. Si el depurador no se asocia a la excepción, el tiempo de ejecución provoca el evento UnhandledException. Si no hay agentes de escucha para el evento UnhandledException, el tiempo de ejecución vuelca un seguimiento de pila y cierra el programa.

Filtrar excepciones en tiempo de ejecución

Las excepciones que se detecten se pueden filtrar y controlar por el tipo o por criterios definidos por el usuario.

Los controladores filtrados por el tipo controlan un tipo concreto de excepción (o las clases que derivan de ella). La forma más común de controlador de excepciones filtrado por el tipo especifica que sólo se detecte una clase de excepción concreta.

En el ejemplo siguiente se muestra un controlador de excepciones diseñado para detectar una excepción concreta, en este caso FileNotFoundException.

Catch e As FileNotFoundException
   Console.WriteLine("[Data File Missing] {0}", e)
catch(FileNotFoundException e) {
    Console.WriteLine("[Data File Missing] {0}", e);
}

Los controladores de excepciones filtrados por el usuario detectan y controlan las excepciones basándose en requisitos que se definen para la excepción. Estos controladores utilizan la instrucción Catch con la palabra clave When en Visual Basic 2005. Para obtener información sobre este tipo de filtrado de excepciones, vea Utilizar excepciones específicas en un bloque Catch.

Vea también

Conceptos

Clase Exception y propiedades

Jerarquía de excepciones

Procedimientos recomendados para controlar excepciones

Otros recursos

Fundamentos del control de excepciones

Controlar y generar excepciones