繁体   English   中英

在没有“捕获”的情况下进行“最终尝试”是否有意义?

[英]Does it make sense to do “try-finally” without “catch”?

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

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

我认为try应该有一个catch

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

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

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

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

之所以存在,是因为程序员想要确保即使 try 块中的代码抛出异常, db.cleanup()调用db.cleanup() 该块不会处理任何异常,但它们只会在执行 finally 块后向上传播。 如果没有异常,finally 块也会被执行。

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

因为显然代码不知道如何处理这个级别的异常。 这很好——只要调用者之一这样做,即只要异常最终在某个地方得到处理。

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

但是代码仍然需要清理它的资源(因为如果不清理,它们就会泄漏),所以它只是在finally子句中这样做,确保它总是发生,无论是否抛出异常。

finally 块确保即使抛出 RuntimeException(可能是由于被调用代码中的某些错误),也会进行db.cleanup()调用。

这也常用于防止过多的嵌套:

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

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

代码这样做是为了确保数据库已关闭。
通常,您的做法是将所有数据库访问代码放在 try 块中,然后在 finally 块中调用关闭数据库。
try...finally 工作的方式意味着 try 块中的代码被运行,并且 finally 块中的代码在完成时运行......无论如何。
没有从墙上猛拉计算机,最终将执行。
这意味着即使调用了异常,并且该方法需要三年时间才能执行,它仍然会进入 finally 块并关闭数据库。

如果 try 块中的任何代码可以抛出已检查的异常,则它必须出现在方法签名的 throws 子句中。 如果抛出未经检查的异常,它会从方法中冒泡出来。

无论是否抛出异常,finally 块都会被执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM