sql >> Databasteknik >  >> RDS >> Oracle

PL/SQL undantagshantering:gör ingenting (ignorera undantag)

Även om jag håller med om att det 99% av gångerna är dålig praxis att tyst ignorera undantag utan att åtminstone logga dem någonstans, finns det specifika situationer där detta är helt acceptabelt.

I dessa situationer är NULL din vän:

[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

Två typiska situationer där det kan vara önskvärt att ignorera undantag är:

1) Din kod innehåller en sats som du vet kommer att misslyckas ibland och du vill inte att detta ska störa ditt programflöde. I det här fallet bör du bifoga din sats i ett kapslat block, som följande exempel visar:

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;

Notera att PL/SQL i allmänhet inte tillåter den On Error Resume Next typ av undantagshantering känd från Visual Basic, där alla undantag ignoreras och programmet fortsätter att köras som om ingenting hänt (se Återuppta nästa typ av felhantering vid fel i PL /SQL oracle ). Du måste uttryckligen omsluta potentiellt misslyckade satser i ett kapslat block.

2) Din procedur är så oviktig att ignorering av alla undantag inte kommer att påverka din huvudprogramlogik. (Detta är dock mycket sällan fallet och kan ofta resultera i en felsökningsmardröm på lång sikt)

BEGIN

    do_stuff();

EXCEPTION

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


  1. SQL Server prestanda för ändra tabell ändra kolumn ändra datatyp

  2. MySQL-grupp efter anpassad tidsstämpel

  3. Alfanumerisk sortering med PostgreSQL

  4. Hur lägger man till ett rel-attribut i varje länk (a href) med hjälp av php?