【问题标题】:What is the difference between try-finally and try-catch-throw?try-finally 和 try-catch-throw 有什么区别?
【发布时间】:2015-04-10 18:10:11
【问题描述】:

所以,我从this question 了解到 finally 块可用于执行代码,即使发生异常并且即使异常未被捕获并允许向上传播。

我从this question 了解到,在 C# 中,throw 关键字可以在 catch 块中单独使用(不带参数)以允许捕获异常继续传播,甚至不重置堆栈跟踪。

那么,我的问题是,这两个块之间有什么区别:

/* example 1 */
try { /* try stuff */ }
finally { /* finally/catch stuff */ }

/* example 2 */
try { /* try stuff */ }
catch { /* finally/catch stuff */ throw; }

不要同时运行try stuff,然后运行finally/catch stuff,然后允许抛出的异常使用相同的堆栈跟踪传播?

【问题讨论】:

    标签: c# exception-handling try-catch try-finally


    【解决方案1】:

    try { /* try stuff */ }
    catch { /* finally/catch stuff */ throw; }
    

    如果没有错误,finally 的东西就不会运行。

    finally{} 块用于清理,您的建议会浪费宝贵的资源。

    您真的错过了这里的重点,只有catch 是关于处理错误(可选分阶段)。 finally 块是关于资源管理的,并且仅与异常相关,因为它会在发生任何异常的情况下执行。

    【讨论】:

      【解决方案2】:

      这样想……

      try
      {
          //do some stuff
      }
      catch
      {
          //do some stuff if there was an exception
          //maybe some cleanup, maybe rethrow exception
      }
      finally
      {
          //always do this stuff exception or not
      }
      

      【讨论】:

      • 啊,当然。所以finally/catch stuff 将在finally 块中运行,即使没有异常,而在catch 块中,它只会在有异常时运行。但是,如果抛出异常,异常本身的处理和传播方式又如何呢?有什么区别吗?
      • catch and finally,尽管相同结构的部分(try/catch/finally)不相关。 Try 是您要尝试执行的代码块(可能成功,也可能不成功)。 Catch 仅用于处理 try 中的代码块失败的情况。它允许您只是吞下异常(不推荐,但我已经看到它在一个无论如何都必须继续运行的服务中完成),将异常包装在一个新异常中以添加更多信息并重新抛出,或者清理/release 东西然后重新扔。最后简单地定义一个始终运行的代码块。
      • 如果catch抛出异常,finally有什么用?它不会执行正确?
      【解决方案3】:

      catch 仅在 try 的内容引发错误时运行,finally 始终在 try 和/或 catch 之后运行。

      【讨论】:

        【解决方案4】:

        不同之处在于,无论是否有异常,finally 块都会执行,而 catch 块仅在有异常时才会执行

        【讨论】:

          【解决方案5】:

          无论您的代码是否引发异常,最终都会运行,但我的理解(我可能错了)如果您重新抛出未处理的 catch,它可能不会运行。 finally 在无论是否发生错误都需要整理时很有用,例如处理连接。

          第二个例子只会让代码在 catch 中运行,或者如果代码没有抛出异常。在这种情况下,我会删除 try catch 并让它冒泡并让 try catch 更高

          【讨论】:

            猜你喜欢
            • 2013-11-09
            • 2010-12-14
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            • 2011-04-17
            • 2014-11-27
            • 1970-01-01
            • 2013-05-18
            相关资源
            最近更新 更多