[英]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.