Является ли ИСКЛЮЧЕНИЕ КОГДА ДРУГИМ, ЧЕМ ПОДНИМАЮТСЯ?
Будучи еще новичком в 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;
Я подозреваю, что включенный код обработки исключений ничего не делает и может просто удаляться, так как я все равно получаю сообщение об ошибке, если что-то пойдет не так. Я прав?
(Я предполагаю, что такой код является результатом дальнейшего редактирования предыдущего кода.)
Ответы
Ответ 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 снова исключение, в то время как программист решает, что следует делать при возникновении исключения.