2013-07-25 62 views
-2

查看展览以检查PL/SQL代码。哪个异常会返回?

SET serveroutput ON 
DECLARE 
    past_due EXCEPTION; 
    acct_num NUMBER; 
BEGIN 
    DECLARE 
    past_due EXCEPTION; 
    acct_num NUMBER; 
    due_date DATE := sysdate -1; 
    todays_date DATE := sysdate; 
    BEGIN 
    IF due_date < todays_date THEN 
     raise past_due; 
    END IF; 
    END; 
EXCEPTION 
WHEN past_due THEN 
    dbms_output.put_line('handling past_due exeption.'); 
WHEN OTHERS THEN 
    dbms_output.put_line('could not recognize rxception.'); 
END; 

哪个声明对于代码的执行是正确的?

A.代码中引发的异常由PAST_DUE 异常的异常处理程序处理。

B.它不执行,因为您不能在 子块中声明具有相似名称的例外。

C.在子块中引发的PAST_DUE异常导致程序突然终止 ,因为子块中没有异常处理程序。

D.封闭块引发的PAST_DUE异常不会传播到外部块,它由WHEN OTHERS异常处理程序处理。

处于低谷的答案是C,但我认为它d

+0

C? d?什么? :-) –

+0

喔对不起,我也加入现在的答案@JoachimIsaksson –

回答

1

(d)是最接近于正确的,但即使它不是真正的权利。在内部块中引发的past_due异常与在外部块中捕获的异常不是相同的past_due异常。因此,内部块的past_due异常被外部块的OTHER处理程序捕获。尝试运行代码,你会看到它打印出“无法识别rxception”。答案(D)的不正确之处在于它说“... PAST_DUE异常...不会传播到外部块...”。这是错误的 - 例外传播到外部块,但由于没有特定的处理程序(也不能作为声明异常声明的上下文不可用),它由WHEN OTHERS...处理程序处理。因此,在我看来,没有任何答案是正确的。

分享和享受。

+0

我应该怎么做,研究考试,如果答案不明确:( @Bob贾维斯 –

+0

我想借此研究问题向教练告诉他希望他能够对这些问题进行合理的讨论,或者如果其他方面都失败了,那么即使答案不完全正确,他也会明白他是如何回答这个问题的。 –

+0

非常感谢很多@Bob jarvis –

0

按照我的答案是C,因为你调用的异常不存在于块中,所以不能搜索它并且不能够提升它并会给出一些错误。

+1

但我尝试在SQL开发人员和它的工作像D @Harshit –

+0

FWIW当我第一次(快速)读完我想的问题时,“答案显然是A”。我必须**运行代码**来实现我的错误。这是一个制造出来的学术问题,国际海事组织比无用的 - 它不仅在程序中有多个级别定义了类似命名的例外,而且如果(如OP所示)“正确”的答案被认为是( C),那么“正确的”答案不仅仅是错误的错误,而是一个不好的例子。海事组织的例外是全球资源,不应该在多个层面重新定义。分享并享受。 –