sql >> Database >  >> RDS >> Oracle

Afhandeling van PL/SQL-uitzonderingen:niets doen (uitzondering negeren)

Hoewel ik het ermee eens ben dat het 99% van de tijd een slechte gewoonte is om uitzonderingen stilzwijgend te negeren zonder ze op zijn minst ergens te loggen, zijn er specifieke situaties waarin dit volkomen acceptabel is.

In deze situaties is NULL je vriend:

[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

Twee typische situaties waarin het negeren van uitzonderingen wenselijk kan zijn, zijn:

1) Uw code bevat een instructie waarvan u weet dat deze af en toe zal mislukken en u wilt niet dat dit feit uw programmastroom onderbreekt. In dit geval moet u uw instructie insluiten in een genest blok, zoals het volgende voorbeeld laat zien:

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;

Merk op dat PL/SQL over het algemeen geen On Error Resume Next type uitzonderingsbehandeling toestaat die bekend is van Visual Basic, waarbij alle uitzonderingen worden genegeerd en het programma blijft draaien alsof er niets is gebeurd (zie Bij fout hervatten volgende type foutafhandeling in PL /SQL orakel ). Je moet potentieel falende statements expliciet insluiten in een genest blok.

2) Uw procedure is zo onbelangrijk dat het negeren van alle uitzonderingen die het veroorzaakt, geen invloed heeft op uw hoofdprogrammalogica. (Dit is echter zeer zelden het geval en kan op de lange termijn vaak leiden tot een nachtmerrie bij het opsporen van fouten)

BEGIN

    do_stuff();

EXCEPTION

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


  1. Hoe kan ik de onderste 50% van een geselecteerde query in SQL-server krijgen?

  2. nhibernate, call-functie in Oracle die sys refcursor retourneert

  3. mysql tussen zoekopdracht in datums

  4. Tabellen opsommen die worden gebruikt in mysql-query?