“鸭子例外”是什么意思?

在Java™教程的“例外的优势”一节中:

一个方法可以阻止任何抛出的exception,从而允许调用堆栈上方的方法来捕获它。

[…]

… …避免一个例外需要一些中间人方法的努力。 任何可以在方法中抛出的检查exception都必须在其throws子句中指定。

这里“鸭子例外”是什么意思? 我search了networking和FOLDOC(免费在线电脑词典),但没有发现任何看起来有希望的东西。

“鸭子例外”是指“不处理例外”。 这实际上解释了这个名字: 对于鸭子来说意味着“逃避;闪避”。

避免exception的方法根本不处理它(例如,因为它不是它的目的)并且让exception被抛出到调用方法。

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

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

请注意,此方法不处理由Files.newBufferedReader(path)引发的IOException ,因为这不是方法目标。 它鸭子,让来电者妥善处理。

请注意,调用者也可能会抛出exception,并让调用者处理它,等等。

那么,躲避只是降低你的头,以避免被打或看到。 在这种情况下,“鸭子exception”就意味着避免你的代码被exception所击中。

为了让你的方法不被exception所击中,你可以通过在方法中声明一个throwsexception来进一步调用堆栈

 public void myMethod() throws IOException { } 

如果你不吃鸭子,你必须catch它:

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

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

正如@ jmcg的评论中所提到的,字面意思是“ DUCK只是降低你的头以避免被打或看到 ”(就像河里的鸭子一样)

我认为鸭意味着重新抛出一个例外…换句话说,无视它希望别人会处理它:)