0
declare
  v number;
begin

  select 1 
    into v 
    from dual 
   where 1=2;

exception
  when others then 
    dbms_output.put_line('A');
  when no_data_found   then
    dbms_output.put_line('B');
end;

在执行此操作时,我收到一个错误,但我在某处读过它,在异常 WHEN OTHERS 中,如果放置在第一个位置,将始终执行抑制其他类型的异常。我在一次采访中被问到这个问题,我和上面一样。有人可以确认吗

4

3 回答 3

1

在 11.2G 中会出现以下错误:

Error at line 1
ORA-06550: line 11, column 3:
PLS-00370: OTHERS handler must be last among the exception handlers of a block
ORA-06550: line 0, column 0:
PL/SQL: Compilation unit analysis terminated

您应该始终将 OTHER 作为最后一个异常处理块

WHEN OTHERS 子句用于捕获尚未由您的命名系统异常和命名程序员定义的异常处理的所有剩余异常。

如果您的代码中只有 WHEN OTHERS 块,那么"PL/SQL procedure successfully completed."将是消息。因为永远不会遇到 OTHER。A 当其他人几乎总是一个 BUG,除非它紧随其后是一个 RAISE。异常块的重点是捕获您期望的异常情况,优雅地处理它们并继续。您应该只捕获您期望的异常并且可以做一些事情。让其他人传播出去,以便您可以检测到它们(这样您就可以看到它们)

我的建议是“完全忽略其他人”

于 2013-10-31T15:55:54.377 回答
0

执行此代码块将引发异常PLS-00370在此处记录):

PLS-00370: OTHERS 处理程序必须是块的异常处理程序中的最后一个

原因:一个或多个异常处理程序出现在 OTHERS 处理程序之后。但是,OTHERS 处理程序必须是块或子程序中的最后一个处理程序,因为它充当所有未明确命名的异常的处理程序。

行动:移动其他处理程序,使其遵循所有特定的异常处理程序。

于 2013-10-31T16:00:48.310 回答
0

您只需将 OTHERS 异常留在最后。例如:BEGIN something EXCEPTION THEN WHEN DUP_VAL_ON_INDEX do something WHEN OTHERS THEN last exception do something END;

于 2015-08-28T14:46:32.913 回答