Chociaż zgadzam się, że w 99% przypadków złą praktyką jest ciche ignorowanie wyjątków bez przynajmniej ich gdzieś rejestrowania, istnieją szczególne sytuacje, w których jest to całkowicie akceptowalne.
W takich sytuacjach NULL jest Twoim przyjacielem:
[...]
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
Dwie typowe sytuacje, w których może być pożądane ignorowanie wyjątków, to:
1) Twój kod zawiera instrukcję, o której wiesz, że od czasu do czasu zawiedzie i nie chcesz, aby ten fakt zakłócał działanie twojego programu. W takim przypadku powinieneś umieścić swoją instrukcję w zagnieżdżonym bloku, jak pokazuje poniższy przykład:
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;
Zauważ, że PL/SQL generalnie nie zezwala na typ obsługi wyjątków On Error Resume Next znany z Visual Basic, gdzie wszystkie wyjątki są ignorowane, a program kontynuuje działanie, jakby nic się nie stało (patrz Po błędzie wznawia następny typ obsługi błędów w PL /wyrocznia SQL ). Musisz wyraźnie zawrzeć potencjalnie błędne instrukcje w zagnieżdżonym bloku.
2) Twoja procedura jest tak nieistotna, że ignorowanie wszystkich zgłoszonych przez nią wyjątków nie wpłynie na logikę głównego programu. (Jednak jest to bardzo rzadki przypadek i na dłuższą metę często może skutkować koszmarem debugowania)
BEGIN
do_stuff();
EXCEPTION
WHEN OTHERS THEN
-- Ignore all exceptions and return control to calling block
NULL;
END;