2013-10-31 93 views
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; 

在执行这个我得到一个错误,但我已经读过它的地方,在例外时,如果首先放置将始终得到执行压制其他类型的异常。我在面试中被问及这个问题,而我则如上所述。可有人请确认这会给出什么样的输出

+1

我不确定我是否理解这个问题。你说你已经执行了这个代码,并且你有错误。你不会说你得到了什么错误(我猜PLS-00370:OTHERS处理程序必须是块的异常处理程序中的最后一个)。你说你“在某处读到”这个行为会有所不同,但是你不会告诉我们你读到的是哪里。另外你还没有告诉我们你使用的是什么版本的Oracle(这种行为可能已经改变了)。鉴于此,我不确定你在问什么。 –

+0

嗨贾斯汀,我试图在oracle 11.2g中执行它。我隐约记得我曾看到它说OTHERS如果放在第一位不会让其他异常类型执行。这就是我所能记得的。该行为可以根据oracle版本进行更改。 错误我得到 PLS-00370:其他处理程序必须是块 ORA-06550的异常处理程序中的最后一个:0行,列0: PL/SQL:编制单位分析终止 06550. 00000 - “行%s,列%s:\ n%s” *原因:通常是PL/SQL编译错误。 *操作: – redsoxlost

回答

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 

你应该总是有其他作为最后一个异常处理块

的WHEN OTHERS子句用于捕获所有剩余您的Named System Exceptions和命名程序员定义的例外尚未处理的例外情况。

如果您的代码中只有WHEN OTHERS块,则"PL/SQL procedure successfully completed."将成为消息。因为OTHER永远不会遇到。 A当其他人几乎总是一个BUG时,除非紧跟着一个RAISE。异常块的要点是要捕获您正在预测的特殊情况,优雅地处理并继续。你应该只抓住你所期望的例外,并且可以做点什么。让其他人传播,所以你可以发现它们(让你看到他们)

我的建议是“不管何时OTHERS TOTALLY”

+0

在这我想我被问到错误的问题 - 我被问到的问题是这样的 如果代码块抛出一个NO_DATA_FOUND错误,并且以异常方式放置了异常块,你会得到什么? EXCEPTION 何时其他 DBMS_OUTPUT.PUT_LINE('a'); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('B'); END; 你会得到什么输出?我说我们会得到'一个'。 – redsoxlost

+0

如果是这样,您将永远不会得到任何输出,因为在WHEN OTHERS之后发生任何异常是错误的。 – SriniV

0

执行该代码块将引发异常PLS-00370(记录here):

PLS-00370:其他处理程序必须是块的异常处理程序中的最后

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

操作:移动OTHERS处理程序,以便它遵循所有特定的异常处理程序。

0

你只需要把OTHERS例外留在最后。 例如: BEGIN 东西 EXCEPTION 那么当DUP_VAL_ON_INDEX 做点什么 WHEN OTHERS THEN 最后一个异常做点什么 END;

+0

请正确格式化您的答案(代码片段)。 –

相关问题