【问题标题】:Does `EXCEPTION WHEN OTHERS THEN RAISE` do something?`Exception WHEN WHEN OTHERS THEN RAISE` 有什么作用吗?
【发布时间】:2013-01-19 01:51:30
【问题描述】:

作为 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;

我怀疑包含的异常处理代码根本不做任何事情并且可以简单地被删除,因为如果出现问题我会收到一条错误消息。我说的对吗?

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

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案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
    

    第一个中的行号指向 raise 而不是实际的行号。它会使跟踪错误变得更加困难。

    【讨论】:

      【解决方案2】:

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

      异常处理是整个语言中最容易被误解的方面。以上是很常见的,我认为它源于基本的误解,即“未处理的异常”是一件坏事(它几乎引出了一个问题——你为什么不处理它?)。如果只有 Oracle 使用术语“发生异常”或“遇到异常”,我们这些必须支持此代码的可怜人将拥有更少的“WHEN OTHERS”异常处理程序,让我们的生活变得悲惨。

      【讨论】:

        【解决方案3】:

        正如@DazzaL 所指出的,它除了掩盖错误行之外什么都不做。但它作为一个提醒,告诉你上面的代码可以引发一个应该处理的异常,但处理仍然未定义。

        在其他编程语言中,您可以自动创建 try/catch 块(例如,在 Eclipse/Java、Netbeans/PHP 或 Visual Studio/C# 中),它是使用默认的 catch 创建的(如“当其他人”)行为是再次抛出异常,而程序员决定在引发异常时应该做什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          • 1970-01-01
          • 2021-05-04
          • 1970-01-01
          相关资源
          最近更新 更多