Propagacion de excepciones en PL/SQL
Una de las características más interesantes de la excepciones es la propagación de excepciones.
Cuando se lanza una excepción, el control se transfiere hasta la sección EXCEPTION del bloque donde se ha producido la excepción. Entonces se busca un manejador válido de la excepción (WHEN <excepcion> THEN, WHEN OTHERS THEN) dentro del bloque actual.
En el caso de que no se encuentre ningún manejador válida el control del programa se desplaza hasta el bloque EXCEPTION del bloque que ha realizado la llamada PL/SQL.
Observemos el siguiente bloque de PL/SQL (Notese que se ha añadido una clausula WHERE 1=2 para provocar una excepcion NO_DATA_FOUND).
DECLARE
fecha DATE; FUNCTION fn_fecha RETURN DATE IS fecha DATE; BEGIN SELECT SYSDATE INTO fecha FROM DUAL WHERE 1=2; RETURN fecha; EXCEPTION WHEN ZERO_DIVIDE THEN dbms_output.put_line('EXCEPCION ZERO_DIVIDE CAPTURADA EN fn_fecha'); END; BEGIN fecha := fn_fecha(); dbms_output.put_line('La fecha es '||TO_CHAR(fecha, 'DD/MM/YYYY')); EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('EXCEPCION NO_DATA_FOUND CAPTURADA EN EL BLOQUE PRINCIPAL'); END;
|
La excepcion NO_DATA_FOUND se produce durante la ejecución de la funcion fn_fecha, pero como no existe ningún manejador de la excepción en dicha funcion, la excepción se propaga hasta el bloque que ha realizado la llamada. En ese momento se captura la excepcion.