“鸭子例外”是什么意思?
在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所击中,你可以通过在方法中声明一个throws
exception来进一步调用堆栈
public void myMethod() throws IOException { }
如果你不吃鸭子,你必须catch
它:
public void myMethod() { try { // ... } catch(IOException e) { // handle exception }
我认为这意味着一个方法可以捕获exception,并重新抛出其他方法来捕获它并根据需要处理它。 或者只是抛出一个新的exception。 或避免捕捉到exception,让它冒出调用堆栈。 重点是有一个方法委托exception处理其他方法可能更适合处理给定的exception(例如通过访问必要的数据和/或状态)。 但是(对于java
)这需要一直使用throws
子句声明方法,这就容易成为样板
正如@ jmcg的评论中所提到的,字面意思是“ DUCK只是降低你的头以避免被打或看到 ”(就像河里的鸭子一样)
我认为鸭意味着重新抛出一个例外…换句话说,无视它希望别人会处理它:)