Ответ 1
Хотя я согласен, что в 99% случаев это плохая практика, чтобы молча игнорировать исключения, по крайней мере, не записывая их где-нибудь, существуют конкретные ситуации, когда это совершенно приемлемо.
В этих ситуациях NULL - ваш друг:
[...]
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
Две типичные ситуации, при которых игнорирование исключений может быть желательным, следующие:
1) Ваш код содержит инструкцию, которая, как вы знаете, иногда будет терпеть неудачу, и вы не хотите, чтобы этот факт прервал поток вашей программы. В этом случае вы должны заключить инструкцию во вложенном блоке, как показано в следующем примере:
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;
Обратите внимание, что PL/SQL обычно не разрешает для класса "Ошибка после ошибки" следующий тип обработки исключений, известный из Visual Basic, где все исключения игнорируются, и программа продолжает работать, как будто ничего не произошло (см. В случае ошибки повторите следующий тип обработки ошибок в оракуле PL/SQL). Вам нужно явно заключить потенциально сбойные утверждения во вложенном блоке.
2) Ваша процедура настолько несущественна, что игнорирование всех исключений, которые она выбрасывает, не повлияет на вашу основную программную логику. (Тем не менее, это очень редко бывает и часто может привести к кошмару отладки в долгосрочной перспективе)
BEGIN
do_stuff();
EXCEPTION
WHEN OTHERS THEN
-- Ignore all exceptions and return control to calling block
NULL;
END;