【问题标题】:C#: why bother having a 'finally' clause? [duplicate]C#:为什么要使用“finally”子句? [复制]
【发布时间】:2010-08-06 18:06:40
【问题描述】:

可能重复:
Why use finally in C#?

在 C# 中,有一个 finally 子句有什么意义?

例如。

try {
        // do something
    }
catch (Exception exc)
    {
        // do something
    }
// do something

最后的代码不会执行吗? finally 块的意义何在?

【问题讨论】:

  • @Otávio 如果 try 或 catch 块中的代码返回怎么办?

标签: c# try-catch-finally


【解决方案1】:

Finally 是针对连catch 都抛出异常的事件,再加上它允许你在成功和失败时执行代码,finally 将总是被执行。总是。

好的,除非应用程序在系统级别被杀死或计算机爆炸。

【讨论】:

  • -1:永远是一个强词。堆栈溢出异常?
  • @Moron:确实,永远可能是一个强有力的词,但它是唯一不需要额外解释段落的词,它说明了重点。
  • @AllenG:不同意。我宁愿有更多的解释而不是有不正确的东西!
  • -1 StackOverflowException ExecutingEngineException(在 FailFast() 上)。两者都不执行 finally 块。这是一个回答问题的网站,而不是提供可能最终伤害用户的误导性信息。
  • 我不知道...如果进程被杀死或计算机爆炸,我仍然相信 finally 块将在某个地方执行...不知何故...在神秘的领域软件来世。
【解决方案2】:

finally 确保块中的任何内容都将被执行,无论前两个语句是否被激活。

一个很好的例子是释放数据库资源。

Try-Catch-Finally

例子:

try
{
   //Open a database connection
}
catch
{
   //Catch exception, database connection failed
}
finally
{
   //Release the opened database connection resources
}

【讨论】:

    【解决方案3】:

    无论之前的代码是否成功,您都希望执行部分代码。通过使用 Try/Catch/Finally,您可以从错误处理中受益。

    【讨论】:

      【解决方案4】:

      因为有些对象你应该执行清理,否则会导致你的应用程序出现问题。

      经常使用的例子是使用SqlConnection:

      SqlConnection conn = new SqlConnection(connString);
      
      try
      {        
          conn.Open();
      
          throw new ArgumentException();
      }
      catch(SqlException ex)
      {
      }
      

      在这种情况下,SqlConnection 保持打开状态,无法关闭它,因为您处理了 SqlException,但引发了 ArgumentException。如果你使用 finally 块,这不会发生,因为 finally 块代码会执行:

      try
      {        
          conn.Open();
      
          throw new ArgumentException();
      }
      catch(SqlException ex)
      {
      }
      finally
      {
          conn.Dispose();
      }
      

      【讨论】:

        【解决方案5】:

        finally 块在捕获到异常时保证运行,即使异常处理块抛出更多异常。通常用于清理某些类型的资源,例如打开的文件句柄、网络连接等...

        这里有很好的例子:

        http://dotnetperls.com/finally

        http://www.csharp-station.com/Tutorials/lesson15.aspx

        【讨论】:

          【解决方案6】:

          Finally 确保如果尝试成功或失败,其中的任何内容都会触发。在发生捕获的情况下,您不能保证最后//do something 处的所有事情都会发生。

          【讨论】:

            【解决方案7】:

            Finally 块中的代码始终执行,无论是否引发异常。如果路径在 catch 中返回,异常块后面的代码可能会执行,也可能不会执行。

            【讨论】:

              猜你喜欢
              • 2019-12-07
              • 2012-07-28
              • 2012-07-18
              • 1970-01-01
              • 1970-01-01
              • 2010-10-07
              • 2012-06-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多