mku*_*kus 66 .net c# exception-handling exception
是否有适合使用try-finally没有catch块的块的情况?
Ada*_*rth 105
您可以使用它来确保在try内容之后或异常之后发生某些操作,但是当您不希望使用该异常时.
需要明确的是,这并不能掩盖异常.finally在异常向上传播到调用堆栈之前运行该块.
当你使用using关键字时,你也会无意中使用它,因为这会编译成一个try-finally(不是精确的转换,但为了参数,它足够接近).
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
Run Code Online (Sandbox Code Playgroud)
运行中的代码finally不能保证运行,但是不保证的情况是相当优势的 - 我甚至不记得它.所有我记得的是,如果你在那种情况下,很有可能是不运行finally不是你最大的问题:-)所以基本上不要出汗.
来自Tobias的更新: finally如果进程被终止,将无法运行.
从Paddy更新: 最终没有在.net中执行的条件try..finally阻止
您可能会看到的最流行的示例是处理数据库连接或外部资源,即使代码失败:
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
// Do stuff.
}
Run Code Online (Sandbox Code Playgroud)
编译成的东西,如:
SqlConnection conn;
try
{
conn = new SqlConnection("");
// Do stuff.
}
finally
{
if (conn != null)
conn.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
don*_*ack 10
使用代码很好的解释:
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
}
Run Code Online (Sandbox Code Playgroud)
如果 MyMethod2 或 MyMethod3 抛出异常,它将被 MyMethod1 捕获。然而,在异常传递给MyMethod1 之前,MyMethod2 中的代码需要运行清理代码,例如关闭数据库连接。
using是等价的try-finally.只有try-finally当你想在里面做一些清理finally并且不关心异常时,你才会使用.
在最好的办法将是
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}
Run Code Online (Sandbox Code Playgroud)
这样做甚至被调用using失败,你的代码也不会失败.
有些条件何时finally无法执行.
StackOverflowException或ExecutingEngineException.希望这能回答你的疑问.
| 归档时间: |
|
| 查看次数: |
48675 次 |
| 最近记录: |