【问题标题】:What does "duck an exception" mean?“鸭子例外”是什么意思?
【发布时间】:2016-02-19 21:19:25
【问题描述】:

在 Java™ 教程的 Advantages of Exceptions 部分:

一个方法可以避开其中抛出的任何异常,从而允许调用堆栈更远的方法捕获它。

[...]

...回避异常需要中间人方法方面的一些努力。任何可以在方法中抛出的检查异常都必须在其throws 子句中指定。

这里的“鸭子异常”是什么意思?我搜索了网络和 FOLDOC(免费在线计算词典),但没有找到任何看起来很有希望的东西。

【问题讨论】:

  • 从教程中显示的伪代码中,我会说这意味着不要在方法本身中捕获异常,而是忽略它(如果发生检查异常,请将其添加到 throws 子句) 以便它可以被调用堆栈中更靠前的方法捕获
  • "duck" 在这种情况下意味着将异常转发给调用者。
  • 好吧... DUCK 的意思是低下头以避免被击中或被看到。为了使您的方法不被异常击中,您可以通过在方法上声明 throws 异常来进一步将其扔到调用堆栈中
  • 这些关于鸭子的问题是怎么回事?

标签: java exception terminology


【解决方案1】:

我认为这意味着一个方法可以捕获异常并重新抛出它以供其他方法捕获并根据需要处理它。或者只是抛出一个新的异常。或者避免捕获异常并让它在调用堆栈中冒泡。关键是要有一个方法将异常处理委托给其他可能更适合处理给定异常的方法(例如,通过访问必要的数据和/或状态)。但是(对于java)这需要始终使用throws 子句声明方法,这很容易成为样板

正如@jmcg 的评论中提到的那样,字面意思是“DUCK 只是意味着低下头以避免被击中或看到”(就像鸭子在河中所做的那样)

【讨论】:

  • 我不认为闪避意味着接住并重新投掷。 “或避免抓住”这部分听起来不错,但前两句话可能不正确。
  • @vikingsteve,也许是这样,但它仍然是关于委托的,一个方法确实可以捕获异常来做一些事情并重新抛出它来委托休息。为完整性添加
  • 好吧,您已经解释了一些案例,但我认为您并没有真正回答这个问题 - 它非常具体:“鸭子”是一个例外。如果它说“处理”异常,那么我认为您描述的案例会更有效。
【解决方案2】:

“躲避异常”的意思是“不处理异常”。这实际上解释了名称:to duck 的意思是“逃避;闪避”。

闪避异常的方法根本不处理它(例如,这不是它的目的),而是将异常抛出给调用方法。

例如,考虑一种方法,其目的是计算文件中的行数。这将是一个简单的实现(Java 8):

private static long numberOfLines(Path path) throws IOException {
    try (BufferedReader br = Files.newBufferedReader(path)) {
        return br.lines().count();
    }
}

请注意,此方法不处理Files.newBufferedReader(path) 抛出的IOException,因为那不是方法目标。它会回避并让调用者适当地处理它。

请注意,调用者也可能会避开异常并让调用者处理它,等等。

【讨论】:

    【解决方案3】:

    嗯,闪避只是为了避免被击中或被看到而低下头。在这种情况下,“躲避异常”只是意味着避免您的代码受到异常的影响。

    为了使您的方法不被异常击中,您可以通过在您的方法上声明一个throws 异常将其进一步抛到调用堆栈中

    public void myMethod() throws IOException {
    
    }
    

    如果你不闪避,你必须catch它:

    public void myMethod() {
        try {
           // ...  
    
        } catch(IOException e) {
          // handle exception
        }
    

    【讨论】:

    • 不幸的是,由于 Java 没有提供一种让异常直接命中方法的方法,因此只有这两个选项。
    • @Elogent try { someCheckedExceptionHere(); } catch (SomeCheckedException e) { throw new RuntimeException(e); } 当我需要处理已检查的异常并且它发生应该导致应用程序崩溃时,我经常这样做(例如,无法加载描述需要启动的 JavaFX 场景的 FXML 文件应用程序)。
    【解决方案4】:

    我认为回避意味着重新抛出异常......换句话说,忽略它希望其他人会处理它:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多