sql >> Databáze >  >> RDS >> Oracle

Zpracování výjimek PL/SQL:nedělat nic (ignorovat výjimku)

I když souhlasím s tím, že v 99 % případů je špatnou praxí mlčky ignorovat výjimky, aniž byste je alespoň někam zaprotokolovali, existují specifické situace, kdy je to naprosto přijatelné.

V těchto situacích je vaším přítelem NULL:

[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

Dvě typické situace, kdy může být žádoucí ignorovat výjimky, jsou:

1) Váš kód obsahuje příkaz, o kterém víte, že občas selže a nechcete, aby tato skutečnost přerušila chod vašeho programu. V tomto případě byste měli příkaz uzavřít do vnořeného bloku, jak ukazuje následující příklad:

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;

Všimněte si, že PL/SQL obecně neumožňuje zpracování výjimek typu On Error Resume Next známého z Visual Basicu, kde jsou všechny výjimky ignorovány a program dále běží, jako by se nic nestalo (viz Při chybě obnoví další typ zpracování chyb v PL /SQL oracle ). Potenciálně chybné příkazy musíte explicitně uzavřít do vnořeného bloku.

2) Váš postup je tak nedůležitý, že ignorování všech výjimek, které vyvolá, neovlivní vaši hlavní logiku programu. (To se však stává velmi zřídka a často to může z dlouhodobého hlediska vést k noční můře ladění)

BEGIN

    do_stuff();

EXCEPTION

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


  1. DateTime on Where Klauzule Oracle

  2. Získejte výsledek z dynamického SQL v uložené proceduře

  3. PostGIS - převod multipolygonu na jeden polygon

  4. Přejmenoval jsem svůj sloupec tak, aby obsahoval název tabulky. Proč už to nemůžu přejmenovat?