是否存在适合使用不带catch块的try-finally块的情况?
发布于 2012-02-15 18:15:25
您可以使用它来确保某些操作发生在try内容之后或异常上,但是当您不希望使用该异常时。
为了清楚起见,这并不会隐藏异常。在异常沿调用堆栈向上传播之前,将运行finally块。
在使用using关键字时,您也可能会无意中使用它,因为它会编译成一个try-finally (不是精确的转换,但出于参数的考虑,它已经足够接近了)。
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}在finally中运行的代码不能保证运行,但是不能保证它的情况是相当边缘的-我甚至记不住了。我所记得的是,如果你在这种情况下,很可能不运行finally不是你最大的问题:-)所以基本上不用担心。
来自托比亚斯的更新:如果进程被终止, finally将不会运行。
来自帕迪的更新: Conditions when finally does not execute in a .net try..finally block
您可能会看到的最常见的示例是,即使代码失败,也要处理数据库连接或外部资源:
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
// Do stuff.
}编译成类似如下的内容:
SqlConnection conn;
try
{
conn = new SqlConnection("");
// Do stuff.
}
finally
{
if (conn != null)
conn.Dispose();
}发布于 2012-02-15 18:17:37
using相当于try-finally。只有当你想在finally中做一些清理工作而不关心异常时,你才会使用try-finally。
的最佳方法将是
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}这样做即使using调用的清理失败,您的代码也不会失败。
在某些情况下,finally不会被执行。
如果存在从外部源终止的任何StackOverflowException或ExecutingEngineException.
希望这能解答你的疑虑。
发布于 2015-04-16 18:03:20
使用代码进行很好的解释:
void MyMethod1()
{
try
{
MyMethod2();
MyMethod3();
}
catch(Exception e)
{
//do something with the exception
}
}
void MyMethod2()
{
try
{
//perform actions that need cleaning up
}
finally
{
//clean up
}
}
void MyMethod3()
{
//do something
}如果MyMethod2或MyMethod3抛出异常,它将被MyMethod1捕获。但是,在将异常传递给MyMethod1之前,MyMethod2中的代码需要运行清理代码,例如关闭数据库连接。
http://forums.asp.net/t/1092267.aspx?Try+without+Catch+but+with+finally+doesn+t+throw+error+Why+no+syntax+error+
https://stackoverflow.com/questions/9291437
复制相似问题