sql >> Base de Datos >  >> RDS >> Oracle

Manejo de excepciones PL/SQL:no hacer nada (ignorar excepción)

Si bien estoy de acuerdo en que el 99 % de las veces es una mala práctica ignorar silenciosamente las excepciones sin al menos registrarlas en alguna parte, hay situaciones específicas en las que esto es perfectamente aceptable.

En estas situaciones, NULL es tu amigo:

[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

Dos situaciones típicas en las que puede ser deseable ignorar las excepciones son:

1) Su código contiene una declaración que sabe que fallará ocasionalmente y no quiere que este hecho interrumpa el flujo de su programa. En este caso, debe encerrar su declaración en un bloque anidado, como muestra el siguiente ejemplo:

CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS
    l_empoyee_name  EMPLOYEES.EMPLOYEE_NAME%TYPE;
BEGIN
    -- Catch potential NO_DATA_FOUND exception and continue
    BEGIN 
        SELECT EMPLOYEE_NAME
        INTO l_empoyee_name
        FROM EMPLOYEES
        WHERE EMPLOYEE_ID = 12345;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
        WHEN OTHERS THEN
            RAISE;
    END;

    do_stuff();

EXCEPTION

    WHEN OTHERS THEN
        -- Propagate exception
        RAISE;
END;

Tenga en cuenta que PL/SQL generalmente no permite el tipo de manejo de excepciones On Error Resume Next conocido de Visual Basic, donde todas las excepciones se ignoran y el programa continúa ejecutándose como si nada (consulte En caso de error, reanude el siguiente tipo de manejo de errores en PL /SQL oráculo ). Debe encerrar explícitamente las declaraciones potencialmente fallidas en un bloque anidado.

2) Su procedimiento es tan poco importante que ignorar todas las excepciones que arroja no afectará la lógica de su programa principal. (Sin embargo, este es el caso muy rara vez y, a menudo, puede resultar en una pesadilla de depuración a largo plazo)

BEGIN

    do_stuff();

EXCEPTION

    WHEN OTHERS THEN
        -- Ignore all exceptions and return control to calling block
        NULL;
END;