Является ли ИСКЛЮЧЕНИЕ КОГДА ДРУГИМ, ЧЕМ ПОДНИМАЮТСЯ? - программирование
Подтвердить что ты не робот

Является ли ИСКЛЮЧЕНИЕ КОГДА ДРУГИМ, ЧЕМ ПОДНИМАЮТСЯ?

Будучи еще новичком в PL/SQL, я копировал и вставлял вокруг следующего триггера:

CREATE OR REPLACE TRIGGER FOO_TRG1
    BEFORE INSERT
    ON FOO
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
BEGIN
    IF :NEW.FOO_ID IS NULL THEN
        SELECT FOO_SEQ1.NEXTVAL INTO :NEW.FOO_ID FROM DUAL;
    END IF;

    EXCEPTION
        WHEN OTHERS THEN RAISE;
END FOO_TRG1;
/
ALTER TRIGGER FOO_TRG1 ENABLE;

Я подозреваю, что включенный код обработки исключений ничего не делает и может просто удаляться, так как я все равно получаю сообщение об ошибке, если что-то пойдет не так. Я прав?

(Я предполагаю, что такой код является результатом дальнейшего редактирования предыдущего кода.)

4b9b3361

Ответ 1

да, это исключение ничего не делает, но вызывает ту же ошибку. также он служит для маскирования реального номера строки ошибки. я бы удалил это, если бы был вами.

например:

SQL> declare
  2    v number;
  3  begin
  4    select 1 into v from dual;
  5    select 'a' into v from dual;
  6  exception
  7    when others
  8    then
  9      raise;
 10  end;
 11  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 9

против

SQL> declare
  2    v number;
  3  begin
  4    select 1 into v from dual;
  5    select 'a' into v from dual;
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 5

номер строки в первом указывает на повышение вместо реального номера строки. он может затруднить отслеживание ошибок.

Ответ 2

Он не просто ничего не делает, он граничит с преступником. В основном он говорит: "Просто для удовольствия, я собираюсь притвориться, что ошибка произошла в этой строке, а не в реальной строке".

Обработка исключений - это самый непонятый аспект всего языка. Вышеприведенное является очень распространенным явлением, и я думаю, что это связано с основным заблуждением, что "необработанное исключение" - это плохо (он почти задает вопрос - почему вы не справились с этим?). Если бы только Oracle использовал терминологию "исключение" или "возникшее исключение", нам, бедным людям, которые должны поддерживать этот код, было бы намного меньше обработчиков исключений "КОГДА ДРУГИХ", делающих нашу жизнь несчастной.

Ответ 3

Он ничего не делает, кроме маскировки строки ошибки, как указывает @DazzaL. Но это служит напоминанием о том, что приведенный выше код может вызвать исключение, которое следует обработать, но лечение остается неопределенным.

В других языках программирования вы можете автоматически создать блок try/catch (например, в Eclipse/Java, Netbeans/PHP или Visual Studio/С#), и он создается с перехватом (например, "когда другие"), для которого по умолчанию используется throw снова исключение, в то время как программист решает, что следует делать при возникновении исключения.