我在项目中使用 try catch和finally 块。我怀疑是...... 为什么我们需要使用finally块,实际上如果不使用finally块那么代码也会在catch块之后执行。所以我们可以在catch块之后做代码(做无资源)。 即使发生异常,这也会执行。如果我们使用最终阻止,那么有什么优势吗?
答案 0 :(得分:7)
根据this之前SO帖子的回答:
finally块内的代码会 无论是否,都会被执行 没有例外。这来了 在某些方面非常方便 你需要的家政服务 总是像关闭连接一样运行。
答案 1 :(得分:1)
我想你正在谈论这个:
try {
// do something that might throw exception
}
catch (Exception) {
// take care of exception
}
finally {
// what is the point of this?
}
如果您处理catch
块中的所有可能异常,那么您可能需要finally
块的唯一原因是拦截return
块内的try
语句
感谢@dthorpe: finally
也会截取catch
块内的任何异常/返回语句。
答案 2 :(得分:1)
只有在抛出异常时,代码才会在catch块中执行。
如果抛出异常,并且没有抛出异常,则代码将在finally块中执行。由于无论是否抛出异常,您都可以依赖finally块始终执行,因此最后可以使用块来清理您分配的任何资源,尤其是非托管资源,例如文件或操作系统句柄。
你提到在catch块释放资源之后依赖于代码的执行。这不是一个安全的假设,因为a)适当约束的catch块不会捕获所有异常,而只是代码需要处理的异常,以及b)catch块本身可以抛出或重新抛出异常。 catch块后面的代码可能无法执行。
如果您习惯于编写捕获所有异常并杀死它们的不合格捕获块,那么您就会滥用异常。
答案 3 :(得分:0)
如果发生异常,您应该使用finally块来取消分配非托管资源。您还可以处理GC或处理“try”中构建的任何一次性类型
答案 4 :(得分:0)
Finally
即使发生exception
,也会执行阻止。因此,您可以关闭Database Connection
块中的Dispose
或其他finally
活动。
答案 5 :(得分:0)
想象一下这个用法:
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部分发生什么,您都将始终正确处置。
答案 6 :(得分:0)
嗯,这实际上取决于你如何使用它,如果你只有空的catch块,那么如果你最后阻止它就没有任何区别。它非常优雅,在你处理catch块中的某些东西的同时也希望一些代码也需要在catch之后执行。
但是,try / catch / finally适用于特殊情况,需要针对最差情况进行规划,以使您的程序更加健壮。如果其中一个catch处理程序重新抛出异常,则catch块之后的代码(不在finally块中)将永远不会被执行。
由于某些特定场景中的代码很有可能无法执行,因此finally块是您执行所需关键操作的保险。您将需要识别此类情况,并且没有这样的规则,即每个try catch块必须具有finally。