当“其他人提升”做某事时是否有例外?

时间:2013-02-04 11:08:23

标签: oracle plsql oracle10g

仍然是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;

我怀疑所包含的异常处理代码什么都不做,可能会被删除,因为如果出现问题我会收到错误消息。我是对的吗?

(我猜这样的代码是进一步编辑先前代码的结果。)

3 个答案:

答案 0 :(得分:29)

是的,该异常除了引发相同的错误外什么也没做。它还用于掩盖错误的实际行号。如果我是你,我会删除它。

例如:

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

VS

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

第一行中的行号指向加号而不是实际行号。它可以更难以追踪错误。

答案 1 :(得分:0)

它根本不会做任何事情,它正在接近犯罪。它基本上说“只是为了好玩,我会假装错误发生在这一行,而不是真正的行。”

异常处理是整个语言中最容易被误解的方面。以上是非常常见的,我认为它源于基本的误解,即“未处理的异常”是一件坏事(它几乎引出了一个问题 - 你为什么不处理它?)。如果只有甲骨文使用了术语“发生异常”或“遇到异常”,那么我们那些不得不支持这些代码的穷人将会有更少的“当其他人”的异常处理程序使我们的生活变得悲惨。

答案 2 :(得分:0)

除了遮罩错误行外,它什么也不做,就像@DazzaL指出的那样。但这提醒您,上面的代码可能会引发异常,应将其处理,但处理方式仍未定义。

在其他编程语言中,您可以自动创建try / catch块(例如,在Eclipse / Java,Netbeans / PHP或Visual Studio / C#中),并使用默认值的catch(例如“当其他时”)创建行为再次引发异常,而程序员决定引发异常时应采取的措施。