¿Cómo se asignan unas excepciones a otras?
Implementación de la nueva emisión de las excepciones
Podemos emitir las excepciones basadas en clases con una de las siguientes variantes de la sentencia RAISE EXCEPTION:
- RAISE EXCEPTION TYPE <exception_class> [EXPORTING …]
Esta sentencia crea un nuevo objeto de excepción que es una instancia de la clase
<exception_class>. De manera opcional, los valores pueden proporcionarse para el constructor utilizando el suplemento EXPORTING.
- RAISE EXCEPTION <object_ref>
Esta sentencia utiliza un objeto de excepción existente, concretamente, cualquier objeto de excepción al cual señala <object_ref>. Este objeto de excepción se creó directamente con una sentencia CREATE OBJECT o, más comúnmente, se interceptó en una sentencia anterior CATCH… Sentencia INTO … y pasa a la llamada de manera explícita.
Después de interceptar una excepción, el programa puede emitir una segunda excepción, etc.
Un objeto de excepción no es válido cuando el programa sale del bloque CATCH. Por lo tanto, el programa de control en el nivel superior solo tiene acceso al último objeto de excepción. Sin embargo, puede concatenar objetos de excepción, es decir, puede dejar que un objeto de excepción apunte a uno anterior que apunta a su anterior, y así sucesivamente. De este modo, el programa de control de una excepción puede seguir la cadena y evaluar cada objeto de excepción en la secuencia.
Todas las clases de excepción brindan el atributo de instancia pública PREVIOUS. Indica el atributo con REF TO CX_ROOT para que apunte a objetos de excepción arbitrarios. Los constructores de todas las clases de excepción tienen un parámetro de importación, PREVIOUS, del mismo tipo que puede usarse para enlazar un objeto de excepción existente a uno nuevo.
En un programa ejecutable creamos las clases locales de excepción LCX_NO_DATE y LCX_FORMAT_UNKNOWN y la clase local habitual LCL_DATE_ANALYZE que implementa dos métodos de instancia en la sección pública ANALYZE_DATE y ANALYZE_FORMAT que emiten excepciones del tipo de las clases locales creadas LCX_NO_DATE y LCX_FORMAT_UNKNOWN. Lanzamos las excepciones unas a otra utilizando el parámetro PREVIOUS del constructor en el evento START_OF_SELECTION implementando un bloque TRY-ENDTRY anidado. Analizamos en el modo DEBUGG las instancias de los objetos de excepción.
La solución en código fuente es la siguiente:
Análisis en el modo DEBUGG. En el atributo PREVIOUS se puede ver la instancia de la excepción anterior LCX_NO_DATE.