El árbol ExceptionList tiene su propio nombre de correlación, ExceptionList, y debe utilizarlo en todas las sentencias ESQL que hacen referencia o establecen el contenido de este árbol.
Este árbol se crea con el árbol lógico cuando se analiza un mensaje de entrada. Inicialmente está vacío y sólo se rellena si se produce una excepción durante el proceso del flujo de mensajes. Es posible que se produzca más de una excepción, si esto sucede, el árbol ExceptionList contiene un subárbol para cada excepción.
Puede acceder al árbol ExceptionList en los nodos Compute, Database y Filter y puede actualizarlo en un nodo Compute. Debe utilizar el nombre de correlación adecuado, esto es, ExceptionList para un nodo Database o Filter e InputExceptionList para un nodo Compute.
Es posible que desee acceder a este árbol en un nodo de un procedimiento de manejo de errores. Por ejemplo, es posible que desee direccionar el mensaje a una vía de acceso diferente basándose en el tipo de excepción, por ejemplo, uno que haya generado explícitamente utilizando una sentencia ESQL THROW o uno generado por el intermediario.
El ESQL siguiente le muestra cómo puede acceder a ExceptionList y procesar cada hijo que contiene:
-- Declarar una referencia para ExceptionList -- (en un nodo Compute utilizar InputExceptionList) DECLARE start REFERENCE TO ExceptionList.*[1]; -- Crear un bucle por los hijos de la lista de excepciones WHILE start.Number IS NOT NULL DO -- más ESQL -- Trasladar el inicio al último hijo del campo al que apunta actualmente MOVE start LASTCHILD; END WHILE;
El segundo ejemplo que se muestra a continuación contiene un ejemplo de ESQL que se ha codificado para que un nodo Compute cree un bucle por la lista de excepciones hasta la descripción de la última excepción (anidada) y extraiga el número de error. Este error se refiere a la causa original del problema y normalmente proporciona la información más precisa. La acción que el flujo de mensajes lleva a cabo a continuación puede decidirse según el número de error que se recupere de este modo.
CREATE PROCEDURE getLastExceptionDetail(IN InputTree reference,OUT messageNumber integer, OUT messageText char) /**************************************************************************** * Un procedimiento que obtendrá los detalles de la última excepción de un mensaje * IN InputTree: La lista de excepciones entrante * IN messageNumber: El último número de mensaje * IN messageText: El último texto de mensaje. *****************************************************************************/ BEGIN -- Crear una referencia al primer hijo de la lista de excepciones declare ptrException reference to InputTree.*[1]; -- seguir con el bucle mientras actúan los desplazamientos al hijo de la lista de excepciones WHILE lastmove(ptrException) DO -- almacenar los valores actuales para el número de error y el texto IF ptrException.Number is not null THEN SET messageNumber = ptrException.Number; SET messageText = ptrException.Text; END IF; -- ahora ir al último hijo, que debería ser la próxima lista de excepciones move ptrException lastchild; END WHILE; END;
Para obtener más información acerca del uso de ExceptionList, consulte el subflujo en el ejemplo Manejador de errores, que incluye ESQL que cuestiona la estructura de ExceptionList y lleva a cabo una acción específica según su contenido.