问题

我看到了一些这样的代码:

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

我以为try应该有acatch

为什么这段代码会这样做?


#1 热门回答(142 赞)

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

public void yourOtherMethod() {
    try {
        yourMethod();
    } catch (YourException ex) {
        // handle exception
    }
}    

public void yourMethod() throws YourException {
    try {
        db.store(mydata);
    } finally {
        db.cleanup();
    }
}

#2 热门回答(64 赞)

它就在那里因为程序员想要确保即使try块内的代码抛出异常也会调用db.cleanup()。该块不会处理任何异常,但它们只会在执行finally块后向上传播。


#3 热门回答(19 赞)

为什么这段代码会这样做?

因为显然代码不知道如何在这个级别处理异常.这很好-只要其中一个调用者这样做,即只要异常最终在某处处理。

通常,低级代码无法对异常做出适当的反应,因为需要通知用户,或者必须记录异常,或者必须尝试其他策略。低级代码仅执行功能,并且不了解更高级别的决策。

但是代码仍然需要清理它的资源(因为如果它没有,它们会泄漏),所以它确实只是在53342020clause中,确保它始终存在,无论是否抛出异常。


原文链接