2009-09-17 1 views
5

Ho appena letto this question, e una soluzione afferma che:Cosa c'è di male in "When Others Then Null" in PL/SQL?

Il fatto che non si sa che hai eccezione NO_DATA_FOUND suggerisce che avete fatto uno dei più grandi errori PL sviluppatori/SQL di sempre fare:

EXCEPTION 
    -- Never do this in real code!!! 
    WHEN OTHERS THEN NULL; 
END; 

mi può spiegare che cosa è l'errore in questa dichiarazione e che cosa si dovrebbe fare per evitare di fare che ...

risposta

14

Il problema consiste nel rilevare tutte le eccezioni e quindi ignorarle. Non saprai mai quando qualcosa è andato storto.

+0

Vuoi dire che la pratica male qui non è quello di utilizzare "Quando Altri Poi Null", ma * solo * con esso, vale a dire la cattura whitout qualsiasi altra eccezione prima? – romaintaz

+1

No, è male usarlo mai. al MOLTO, la tua clausola quando altri dovrebbe registrare l'eccezione da qualche parte. ma molto probabilmente dovresti registrare e sollevare l'eccezione –

+3

@Matthew: non sono d'accordo. Esistono numerosi scenari perfettamente validi in cui si desidera rilevare tutte le eccezioni e ignorarle. Che tu li acceda o meno dipende da te. Sono d'accordo che 9 volte su dieci vorresti fare un qualche tipo di registrazione, ma se sto facendo un qualche tipo di codice best-effort in un'API di basso livello usata frequentemente, probabilmente salterò i costi generali di registrazione . – darreljnz

1

Non c'è niente di sbagliato in questo snippet di codice se non si desidera che l'eccezione del blocco pl/sql si propaghi ulteriormente, ad esempio. Se lo fai apposta, non è un codice errato o un errore. Questo è il trucco tutto in pl/sql. E potrebbero esserci situazioni nel codice in cui sono nidificati blocchi BEGIN/EXCEPTION/END e si potrebbe non volere che la transazione fallisca solo se una particolare sezione trasversale di codice fallisce. Non puoi dire che è una cattiva programmazione se lo fai intenzionalmente per qualsiasi motivo/esigenza.

BEGIN 

    --something important here 

    --something even more important here 

    BEGIN 
    --something secondary goes here but not important enough to stop the process or 
    --log a message about it either 
    --maybe send an informative email to the support group or 
    --insert a log message when debugging the process or 
    --the list could go on and on here 
    EXCEPTION 
    --I don't care if this block fails, absorbing all errors regardless of type 
    WHEN OTHERS THEN NULL; 
    END; 

    -- something super important here, must happen 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    -- do something useful for this exception 
    WHEN OTHERS THEN 
    -- do something by default if we don't expect this error 
END; 
+2

In pratica è molto raro non preoccuparsi di alcuna possibile eccezione. Il 99,9% del codice 'when others then null' è quando qualcuno vuole ignorare un errore specifico ma è troppo pigro per catturarlo correttamente. –