【问题标题】:which exception will return? [closed]哪个异常会返回? [关闭]
【发布时间】:2013-07-25 12:09:39
【问题描述】:

查看展览以检查 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

【问题讨论】:

  • 哦,对不起,我现在添加答案@JoachimIsaksson

标签: exception plsql


【解决方案1】:

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

分享和享受。

【讨论】:

  • 如果答案不清楚,我应该怎么做才能准备考试:( @Bob Jarvis
  • 我会将这个学习问题交给导师,并告诉他其中存在的问题。希望他愿意对这些问题进行理性的讨论,或者,如果所有其他方法都失败了,即使这个答案并不完全正确,你也会明白他希望如何回答这个问题。
  • 非常感谢@Bob jarvis
  • +1。 D 也是错误的,因为它指的是“PAST_DUE 异常由封闭块引发” - 封闭块是外部块,这意味着 D 指的是最外面的 PAST_DUE 异常,它永远不会被无论如何,这段代码。
【解决方案2】:

在我看来,答案是 C,因为您调用的 Exception 不存在于块中,因此将无法搜索它,也无法引发它并会给出一些错误。

【讨论】:

  • 但我在 sql developer 中尝试它,它的工作类似于 D @Harshit
  • FWIW 当我第一次(快速)阅读我认为“答案显然是 A”的问题时。我必须运行代码来发现我的错误。这是一个虚构的学术问题,IMO 比无用更糟糕 - 它不仅在程序的多个级别定义了同名的异常,而且如果(如 OP 所示)“正确”答案被认为是( C)那么“正确”的答案不仅是完全错误的,而且是一个糟糕的例子。 IMO 例外是不应在多个层面重新定义的全球资源。分享和享受。
猜你喜欢
  • 2018-01-28
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2013-04-09
  • 2017-07-16
  • 1970-01-01
  • 2019-06-10
  • 2023-03-13
相关资源
最近更新 更多