WMB: Uso manejadores de Excepciones en ESQL (HANDLER) 1


Para conseguir un correcto manejo de errores en ESQL con Message Broker, se utiliza la sentencia DECLARE HANDLER, la cual crea un manejador de errores para manejar las excepciones.

  1. Ámbito.
  2. Comportamiento.
  3. Valores.
  4. Registros especiales.
  5. Ejemplos.

  • ÁMBITO:

Se puede declarar manejadores tanto en ámbitos declarados explícitamente (BEGIN…END) como en ámbitos declarados implícitamente (por ejemplo, la cláusula ELSE de una sentencia IF). Sin embargo, todas las declaraciones de manejadores deben estar juntas al principio del ámbito, antes de cualquier otra sentencia.

– Los ámbitos se buscan desde los más internos a los más externos (LIFO).
– Dentro de cualquier ámbito, los manejadores se buscan en el orden en que se han declarado; es decir, del primero al último (FIFO).
– Los manejadores pueden contener otros manejadores de excepciones que se produzcan dentro del mismo. Es decir, es posible anidar manejadores.

  • COMPORTAMIENTO:

Si no se producen excepciones, la presencia de manejadores no afecta al comportamiento ni al rendimiento de un programa SQL. Si se produce una excepción, WMB compara el estado SQL de la excepción con los estados SQL asociados a cualquier manejador relevante, hasta que o bien la excepción deja el nodo (como lo haría si no hubiera manejadores) o bien se encuentra un manejador que coincide.

Si el proceso del código del manejador se completa sin generar excepciones no manejadas adicionales, se reanuda la ejecución del código normal, del modo siguiente:

SENTENCIA REANUDACIÓN
EXIT Se reanuda la ejecución en la siguiente sentencia procesada es la primera sentencia después del ámbito del manejador.
CONTINUE Se reanuda la ejecución en es la primera sentencia contenida directamente después de la que ha generado la excepción.
NOTA: Los manejadores absorben las excepciones, impidiendo que lleguen al nodo de entrada y hagan que la transacción se confirme en lugar de que se restituya. En otras palabras, no se hace rollback hacia el nodo de entrada del mensaje cuando falla. Un manejador puede utilizar una sentencia RESIGNAL o THROW para impedirlo.
  • VALORES:

Los valores de estado SQL proporcionados en sentencias DECLARE… HANDLER… pueden compararse directamente con el estado SQL de la excepción:

SENTENCIA VALOR DESCRIPCIÓN
VALUE ‘12345’ Compara directamente con el valor. También se puede especificar sin operador de condición.
LIKE ‘_’ (carácter de subrayado) Cada carácter de subrayado representa un solo carácter de tipo comodín.
LIKE ‘%’ (carácter de porcentaje) El carácter de porcentaje representa varios caracteres de tipo comodín.

Sentencias válidas:

  • REGISTROS ESPECIALES:

Cada manejador tiene sus propios registros especiales SQLCODE, SQLSTATE, SQLNATIVEERROR y SQLERRORTEXT. Consultar cada uno de ellos para ver sus caracterísitcas e información más detallada.

Éstos entran en el ámbito y sus valores se establecen justo antes de que se ejecute la primera sentencia del manejador. Siguen siendo válidos hasta que se ha ejecutado la última sentencia del manejador. Puesto que los valores SQLSTATE no se pasan de un manejador a otro, los manejadores pueden escribirse de forma independiente.

  • EJEMPLOS:

# EJEMPLO 1: Se muestra el uso correcto de una USER EXCEPTION y del paso de SQLCODE, SQLSTATE, SQLNATIVEERROR y SQLERRORTEXT de la excepción al manejador. El ejemplo también utiliza SQLSTATE para captar la excepción específica:

Con EXIT (como el ejemplo de arriba) la salida es:

Si se cambia el HANDLER a CONTINUE (DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE ‘U11222’) la salida es:

# EJEMPLO 2: Eliminar las tablas para que se puedan volver a crear con la definición más reciente. Si el programa no se ha ejecutado nunca anteriormente, se producirán errores porque no puede eliminar tablas que no existen. Ignoramos estos errores (al ser de tipo CONTINUE y no tratar las excepciones).

Fuentes:
Sentencia DECLARE HANDLER.
Funciones de estado de base de datos ESQL.


Un comentario en “WMB: Uso manejadores de Excepciones en ESQL (HANDLER)

Comentarios están cerrados.