Подтвердить что ты не робот

Обработка исключений PL/SQL: ничего не делать (игнорировать исключение)

Это вопрос, который меня задают очень часто. Поскольку я не мог найти точного дубликата в stackoverflow, я думал, что разместил его как ссылку.

Вопрос: В PL/SQL я знаю, как поймать исключения и выполнить код, когда они пойманы, и как распространять их на вызывающий блок. Например, в следующей процедуре исключение NO_DATA_FOUND обрабатывается напрямую, а все остальные исключения добавляются в вызывающий блок:

CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS
BEGIN
    do_stuff();

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        -- Do something
        handle_exception();

    WHEN OTHERS THEN
        -- Propagate exception
        RAISE;
END;

Но какую команду я должен использовать для игнорирования одного или всех поднятых исключений и возврата контроля выполнения обратно в вызывающий блок?

4b9b3361

Ответ 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;

Ответ 2

Другой сценарий, когда имеет смысл молча игнорировать исключение: Когда вы вызываете script, который должен создать объект, если он не существует, и у вас нет синтаксиса create-or-replace для этого объекта. Объекты PLSQL имеют синтаксис create-or-replace, но таблицы и индексы этого не делают. Затем мы можем поместить такие скрипты в блок и игнорировать поднятое исключение.