function execDropTable(status StatusRec inOut)
try
execute #sql{
DROP TABLE EGL.CUSTOMERTEMP
} ;
onException (exception SQLException)
ConditionHandlingLib.HandleException(status, exception);
end
end
Cuando se coloca código en un bloque try, EGL
intenta ejecutar ese código como es habitual. Si EGL encuentra errores, detiene
la ejecución del código en el bloque try y se desplaza
directamente al bloque onException, pasando por alto las
sentencias restantes del bloque try. Puede colocar código en
el bloque onException para realizar la recuperación del error,
corregir el problema o escribir información de error en el archivo de registro. Cuando EGL encuentra un error dentro de un bloque try, también crea un registro de excepción para suministrar información acerca del error. Pasa ese registro al bloque onException. Dentro del bloque onException, puede utilizar la información de ese registro para facilitar la determinación de la causa del error y realizar su recuperación. En el ejemplo anterior, el bloque onException pasa el registro de excepción a una función que trata con el error.
Los registros de excepción pueden tener uno o varios estereotipos, dependiendo del tipo de error. En el ejemplo anterior, el bloque onException espera un registro de excepción con el estereotipo SQLException, que está destinado a errores de SQL y a otros errores de base de datos relacional. Si EGL encuentra un tipo de error diferente, como por ejemplo una referencia a un valor nulo, crea un tipo de registro de excepción diferente (en el caso de una referencia a un valor nulo, un registro de excepción con el estereotipo NullValueException).
function execDropTable(status StatusRec inOut)
try
execute #sql{
DROP TABLE EGL.CUSTOMERTEMP
} ;
onException (exception SQLException)
ConditionHandlingLib.HandleException(status, exception);
onException (exception AnyException)
HandleOtherError(exception);
end
end
En este ejemplo, el primer bloque onException
espera un registro SQLException y el segundo bloque espera el estereotipo AnyException. En
este caso, si EGL encuentra un error de SQL, se ejecuta el primer bloque
onException; si EGL encuentra cualquier otro tipo de error, se
ejecuta el segundo bloque. El estereotipo AnyException es un estereotipo de registro de
excepción de usuario genérico utilizado para responder a cualquier error
independientemente
del estereotipo. Todos los registros de excepción tienen como mínimo dos campos: un campo messageID con el código del error y un campo message con una breve descripción del problema. Dependiendo del estereotipo, los registros de excepción pueden tener otros campos. Por ejemplo, el estereotipo SQLRecord tiene un campo sqlState que contiene un valor CHAR(5) con el estado de la sentencia, y un campo sqlCode que contiene un código de retorno INT de DBMS.
Puede probar el manejo de excepciones pasando información no válida, suprimiendo o actualizando un registro inexistente o intentando añadir un registro con la misma clave primaria. El ejemplo siguiente intenta añadir un registro de cliente nuevo con el mismo número de ID que el de una fila existente en la base de datos, lo cual provocará un conflicto con las claves primarias y se solicitará a EGL que lance una excepción de tipo SQLException.
Por ejemplo, imagine que está realizando varios cambios en la base de datos, como por ejemplo añadiendo un cliente nuevo y especificando información para el primer pedido de dicho cliente. Si algunas de estas operaciones han sido satisfactorias antes de que otra falle, puede quedarse con un cliente sin pedidos o con un pedido sin cliente que lo hay efectuado. En este caso, puede colocar una retrotracción (rollback) en el bloque onException para deshacer los cambios y mantener la información incompleta fuera de la base de datos:
Pedido añadido satisfactoriamente. SQL exception EGL0504E message = EGL0504E ADD: La sentencia ha terminado anormalmente porque habría provocado un valor de clave duplicado en una restricción de clave exclusiva o primaria o en un índice exclusivo identificado por 'SQL070307095259210' definido en 'CUSTOMER'.[sqlstate:23505][sqlcode:20000] EGL0002I El error se ha producido en el programa exceptionHandlingTest que procesa la función main. Se realiza la retrotracción. El pedido se ha retrotraído satisfactoriamente.Este es el código completo del archivo exceptionHandlingTest.egl. Si ve errores marcados con símbolos X rojos en el archivo, asegúrese de que el código coincide con el código de este archivo: Archivo exceptionHandlingTest.egl completado después de la lección 7.