Oracle 当其他人提出“例外”时,“例外”是否做了什么?

Oracle 当其他人提出“例外”时,“例外”是否做了什么?,oracle,plsql,oracle10g,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; E

作为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;
我怀疑包含的异常处理代码根本不起任何作用,可能会被删除,因为如果出现问题,我会收到错误消息。我说得对吗


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

是的,该异常只会引发相同的错误。它还用于掩盖错误的实际行号。如果我是你,我就把它拿走

例如:

vs:


第一行中的行号指向提升,而不是实际行号。它可以使追踪错误变得更加困难。

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


异常处理是整个语言中最容易被误解的方面。上述情况非常普遍,我认为这源于一种基本的误解,即“未处理的异常”是一件坏事(这几乎回避了一个问题——你为什么不处理它?)。如果甲骨文只使用“异常发生”或“异常遭遇”这两个术语,那么我们这些不得不支持这段代码的穷人将很少有“当其他人”的异常处理程序让我们的生活痛苦不堪。

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

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

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