Ä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;