Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PL/SQL-Ausnahmebehandlung:nichts tun (Ausnahme ignorieren)

Obwohl ich zustimme, dass es in 99% der Fälle eine schlechte Praxis ist, Ausnahmen stillschweigend zu ignorieren, ohne sie zumindest irgendwo zu protokollieren, gibt es bestimmte Situationen, in denen dies durchaus akzeptabel ist.

In diesen Situationen ist NULL Ihr Freund:

[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

Zwei typische Situationen, in denen das Ignorieren von Ausnahmen wünschenswert sein könnte, sind:

1) Ihr Code enthält eine Anweisung, von der Sie wissen, dass sie gelegentlich fehlschlägt, und Sie möchten nicht, dass diese Tatsache Ihren Programmablauf unterbricht. In diesem Fall sollten Sie Ihre Anweisung in einen verschachtelten Block einschließen, wie das folgende Beispiel zeigt:

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;

Beachten Sie, dass PL/SQL im Allgemeinen nicht die aus Visual Basic bekannte Art der Ausnahmebehandlung On Error Resume Next zulässt, bei der alle Ausnahmen ignoriert werden und das Programm weiterläuft, als ob nichts passiert wäre (siehe Bei Fehler die nächste Art der Fehlerbehandlung in PL fortsetzen /SQL-Orakel ). Potenziell fehlerhafte Anweisungen müssen explizit in einen verschachtelten Block eingeschlossen werden.

2) Ihre Prozedur ist so unwichtig, dass das Ignorieren aller Ausnahmen, die sie auslöst, Ihre Hauptprogrammlogik nicht beeinflusst. (Dies ist jedoch sehr selten der Fall und kann auf lange Sicht oft zu einem Debugging-Albtraum führen)

BEGIN

    do_stuff();

EXCEPTION

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