Controlar y generar excepciones

Las aplicaciones deben ser capaces de controlar los errores que se producen durante la ejecución de una manera coherente. Common Language Runtime proporciona un modelo para notificar los errores de una manera uniforme a las aplicaciones. Todas las operaciones de .NET Framework informan de un error iniciando excepciones.

Este tema contiene las siguientes secciones:

  • Excepciones en .NET Framework

  • Excepciones frente a métodos tradicionales de control de errores

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

  • Filtrar excepciones en tiempo de ejecución

  • Temas relacionados

  • Referencia

Excepciones en .NET Framework

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 System.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.

Volver al principio

Excepciones frente amétodos tradicionales de control de errores

Hasta ahora, el modelo de control de errores de un lenguaje dependía de la forma exclusiva que tenía el lenguaje de detectar los errores y buscarles controladores o del mecanismo de control de errores proporcionado por el sistema operativo. El tiempo de ejecución implementa el control de excepciones con las características siguientes:

  • Controla las excepciones independientemente del lenguaje que las genera o del que las controla.

  • No requiere una sintaxis del lenguaje concreta para controlar las excepciones, si no que permite que cada lenguaje defina su propia sintaxis.

  • Permite que las excepciones se inicien traspasando los límites de los procesos e, incluso, los equipos.

Las excepciones ofrecen varias ventajas respecto a otros métodos de notificación de error, como los códigos devueltos. Ningún error pasa desapercibido. Los valores no válidos no se siguen propagando por el sistema. No es necesario comprobar los códigos devueltos. Es muy sencillo agregar código de control de excepciones para aumentar la confiabilidad del programa. Por último, el control de excepciones en tiempo de ejecución es más rápido que el control de errores de C++ basado en Windows.

Dado que los subprocesos de ejecución recorren de forma rutinaria bloques de código administrado y no administrado, el tiempo de ejecución puede iniciar o detectar excepciones tanto en código administrado como en no administrado. El código no administrado puede incluir excepciones SHE del tipo de C++ y resultados HRESULTS basados en COM.

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

El runtime 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 excepciones (instrucciones catch). Esta tabla de excepciones es muy eficiente y no provoca 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 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 runtime busca la matriz del primer bloque protegido que realiza lo siguiente:

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

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

  2. Si hay una coincidencia, el runtime crea un objeto Exception que describe la excepción. A continuación, el runtime 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 excepciones 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 runtime 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 AppDomain.UnhandledException. Si no hay agentes de escucha para este evento, el runtime vuelca un seguimiento de pila y cierra la aplicación.

Volver al principio

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 administran un tipo concreto de excepción (o las clases que derivan de ella). En el ejemplo siguiente se muestra un controlador filtrado por el tipo que está 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);
}
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. Para obtener información sobre el filtrado de excepciones de este modo, vea Utilizar excepciones específicas en un bloque Catch.

Volver al principio

Temas relacionados

Título

Descripción

Clase Exception y propiedades

Describe los elementos de un objeto de excepción.

Jerarquía de excepciones

Describe las excepciones de las que derivan la mayoría de las excepciones.

Fundamentos del control de excepciones

Explica cómo controlar excepciones mediante instrucciones Catch, Throw y Finally.

Procedimientos recomendados para controlar excepciones

Describe los métodos sugeridos para controlar excepciones.

Controlar excepciones de interoperabilidad COM

Describe como controlar las excepciones iniciadas y detectadas en código no administrado.

Cómo: Asignar resultados HRESULT y excepciones

Describe la asignación de excepciones entre código administrado y no administrado.

Volver al principio

Referencia

System.Exception

System.ApplicationException

System.SystemException