
Anteriormente en este curso, observamos el tratamiento de errores mediante las sentencias TRY, CATCH y ENDTRY. Después de la sentencia TRY aparece la sentencia que puede causar un error. Si se produce el error, el sistema pasará a la sentencia CATCH y procesará su contenido. Independientemente de lo que ocurra, el método continúa el procesamiento después de la sentencia ENDTRY.

En un bloque TRY…ENDTRY, puede incluir más de una sentencia CATCH. Esto le permite tratar diferentes excepciones de forma diferente.

Puede enumerar varias excepciones en una única sentencia CATCH. En este ejemplo, se procesará el mismo bloque CATCH si el sistema desencadena cx_sy_arithmetic_error o cx_sy_zerodivide.

Cuando enumera una clase en una sentencia CATCH, el sistema procesará el bloque correspondiente si se desencadena una excepción con esa clase o una de sus subclases. En este ejemplo, cx_sy_arithmetic_error es una clase superior de cx_sy_arithmetic_overflow y cx_sy_zerodivide. Consecuentemente, el bloque se procesará si se genera una excepción con el tipo de cualquiera de las subclases.

Todas las clases de excepción forman parte de una jerarquía de herencia cuya clase superior superior es la clase cx_root. Como ya hemos visto, si utiliza una clase superior en una sentencia CATCH, el sistema saltará a ella si se desencadena una excepción con el tipo de cualquiera de sus subclases. Dado que todas las clases de excepción son subclases de cx_root, la sentencia CATCH cx_root es suficiente para interceptar cualquier excepción.
Secuencia de sentencias CATCH

Al escribir sentencias CATCH, debe colocar primero la clase (o clases) más específica y las más genéricas en último lugar. Si coloca una clase superior por encima de una de sus subclases, provocará un error de sintaxis. Esto se debe a que el sistema no ha podido procesar el bloque CATCH específico porque está eclipsado por el más genérico.
El suplemento INTO
Cada excepción se representa mediante un objeto. Puede colocar este objeto en una variable de referencia y trabajar con él, por ejemplo, para recuperar el texto de error de la clase de excepción utilizando el método get_text( ) como se muestra en el ejemplo.

Puede utilizar una declaración en línea en la sentencia CATCH para garantizar que la variable de referencia se declare con el tipo correcto.
Lo más común que hay que hacer con el objeto de excepción es llamar a su método get_text( ). Sin embargo, los objetos de excepción pueden poseer otros atributos y métodos para ayudarle a gestionar el error.

Las clases de excepción pueden tener atributos que describan de forma más precisa lo que ha fallado. Estos atributos se utilizan a menudo para rellenar los reserva-espacios de los mensajes. Defina un atributo en la sección pública de la clase de excepción con su nombre y tipo adecuados.
Para rellenar un atributo cuando se emite la excepción, necesita un parámetro de importación correspondiente del constructor de la clase de excepción. Puede generar este parámetro de importación mediante una corrección rápida. Sitúe el cursor en el nombre de método constructor y pulse Ctrl + 1. Seleccione la corrección rápida Volver a generar constructor.
Propagación de excepciones

Un método puede propagar una excepción a lo largo de la cadena de llamadas. En lugar de utilizar la sentencia CATCH para tratar la excepción, el método incluye la cláusula RAISING en su definición. Esto indica a los programas de llamada del método que se les puede transferir la excepción.
Si la excepción no se intercepta en ninguna parte de la cadena de llamadas, se producirá un error en tiempo de ejecución.
El atributo previous
A veces, dentro de una cadena de llamadas, un método interceptará una excepción y, en respuesta, emitirá una excepción diferente para que su propio llamador intercepte. Esto puede suceder, por ejemplo, si un framework emite una excepción que está demasiado orientada técnicamente para que la aplicación se procese. El método que desencadena su propia excepción puede transmitir la primera excepción. Puede hacerlo utilizando el atributo previous de la clase de excepción.

Cuando emite una excepción, puede transferir una instancia de una clase de excepción al parámetro de importación previous. Esto adjunta el objeto de excepción a la nueva excepción. Un método que intercepta la segunda excepción puede acceder al primer objeto de excepción utilizando el atributo público de solo lectura previous.
Como previous se implementa en la clase superior cx_root, está disponible en todas las clases de excepción.