没有“抓”,做“终极试”是否有意义?

我看到这样的一些代码:

try { db.store(mydata); } finally { db.cleanup(); } 

我以为try应该有一个catch

为什么这个代码这样做呢?

如果您希望当前正在执行的方法仍然抛出exception,同时允许资源适当地清理,这非常有用。 以下是处理来自调用方法的exception的具体示例。

 public void yourOtherMethod() { try { yourMethod(); } catch (YourException ex) { // handle exception } } public void yourMethod() throws YourException { try { db.store(mydata); } finally { db.cleanup(); } } 

它在那里是因为程序员想要确保db.cleanup()被调用,即使try块内的代码抛出一个exception。 任何exception都不会被该块处理,但只有在finally块执行后才会向上传播。

为什么这个代码这样做呢?

因为显然代码不知道如何处理这个级别的exception。 没关系 – 只要有一个调用者这样做,即只要exception最终得到处理。

通常,底层代码无法对exception作出适当的反应,因为用户需要得到通知,或者必须loggingexception,或者尝试其他策略。 底层代码只执行一个function,不知道更高层次的决策。

但是代码仍然需要清理它的资源(因为如果没有的话,它们会泄漏),所以它只是在finally子句中,确保它总是发生,不pipe是否抛出exception。

finally块确保即使在引发RuntimeException(也许是由于被调用代码中的一些错误)时, db.cleanup()调用将被创build。

这也经常用来防止太多的嵌套:

 try { if (foo) return false; //bla ... return true; } finally { //clean up } 

特别是当方法返回的点很多时,这提高了可读性,因为任何人都可以看到清理代码被调用。

代码是这样做的,以确保数据库closures。
通常,这样做的方法是将所有的数据库访问代码放在try块中,然后在finally块中调用closures数据库。
try … finally的方式工作,意味着try块中的代码运行,并且finally块中的代码在完成时运行…不pipe是什么。
电脑被从墙上拉下来,终于执行。
这意味着即使有一个exception被调用,并且该方法需要三年时间才能执行,它仍然会在finally块中,并且数据库将被closures。