使用'try-finally'块而不使用'catch'块

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)

  • @AnthonyBlake异常未隐藏.如果发生异常,它将运行finally,然后将异常传播回调用堆栈. (11认同)
  • 至于边缘情况,如果进程被终止,则终止将不会运行(例如,在任务管理器中使用"终止进程"或者因为停电). (2认同)
  • 最后不会在我能想到的三个场景中调用:杀死进程,堆栈溢出和内存不足.所有这些基本上都会在遇到它们的确切位置停止执行程序,并发出操作系统信号以终止该过程. (2认同)

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 中的代码需要运行清理代码,例如关闭数据库连接。

http://forums.asp.net/t/1092267.aspx?Try+without+Catch+but+with+finally+doesn+t+throw+error+Why+no+syntax+error+

  • 这种“清理”的一个例子是 saveLogFile(),无论如何,我经常想将其放在程序的最后。 (2认同)

Ama*_*ure 5

using是等价的try-finally.只有try-finally当你想在里面做一些清理finally并且不关心异常时,你才会使用.

最好的办法将是

try
{
   using(resource)
   {
       //Do something here
   }   
}catch(Exception)
{
     //Handle Error
}
Run Code Online (Sandbox Code Playgroud)

这样做甚至被调用using失败,你的代码也不会失败.

有些条件何时finally无法执行.

  • 如果有任何StackOverflowExceptionExecutingEngineException.
  • 进程被外部源杀死.

希望这能回答你的疑问.