试着在C区接球
本文关键字: | 更新日期: 2023-09-27 18:00:55
我在项目中使用try-catch和finally块。我的疑问是。。。为什么我们需要使用finally块,实际上如果不使用finally,那么代码也会在catch块之后执行。所以我们可以在catch块之后执行代码(以实现资源空闲(。即使发生异常,也会执行此操作。那么,如果我们最终使用块,有什么优势吗?
根据上一篇SO文章的答案:
finally块中的代码将无论是没有例外。这个来了当涉及到某些问题时非常方便您需要的内务管理功能总是像关闭连接一样运行。
只有在抛出异常时,代码才会在catch块中执行。
如果抛出异常,并且没有抛出异常,代码将在finally块中执行。由于无论是否引发异常,您都可以依赖finally块始终执行,因此finally块是您应该清理分配的任何资源的地方,尤其是文件或操作系统句柄等非托管资源。
您提到依靠在catch块之后执行代码来释放资源。这不是一个安全的假设,因为a(一个适当约束的catch块不会捕获所有异常,而只是捕获代码需要处理的异常;b(catch块本身可以抛出或重新抛出异常。catch块后面的代码可能无法执行。
如果你习惯于编写不合格的捕获块来捕获所有异常并杀死它们,那么你就是在滥用异常。
我想你在谈论这个:
try {
// do something that might throw exception
}
catch (Exception) {
// take care of exception
}
finally {
// what is the point of this?
}
如果在catch
块中处理所有可能的异常,则可能需要finally
块的唯一原因是从try
块中截取return
语句。
感谢@dthorpe:finally
还将拦截catch
块中的任何异常/返回语句。
在发生异常时,应该使用finally块来取消分配非托管资源。您还可以处理GC或Dispose在"try"中构建的任何一次性类型
Finally
块被执行,即使exception
是否发生。因此,您可以关闭finally
块中的Database Connection
或其他Dispose
活动。
想象一下这个用法:
String doSomething()
{
SqlConnection conn;
try {
conn = new SqlConnection();
// SQL stuff
return result;
}
catch(Exception ex) { AddToLog(ex); }
finally {
if (conn != null)
conn.Dispose();
}
return null;
}
无论SQL部分发生什么,您都将始终正确处理。
这实际上取决于你如何使用它,如果你只有空的catch块,那么如果你有没有finally块,那就没有什么区别了。如果您正在处理catch块中的某些内容,并且希望在发布catch时也执行一些代码,那么它非常优雅。
然而,try/catch/finaly适用于特殊情况,需要针对最坏的情况进行规划,以使您的程序更加健壮。如果某个catch处理程序重新引发异常,那么catch块后面的代码(不在finally块中(将永远不会执行。
由于某些特定场景中的代码很有可能无法执行,因此finally块是您执行所需关键操作的保险。您需要识别这样的情况,并且没有这样的规则,即每个try-catch块都必须有一个finally。