【问题标题】:Is it ever good pratice to throw an exception in a finally block?在 finally 块中抛出异常是一种好习惯吗?
【发布时间】:2012-08-22 14:05:30
【问题描述】:

有一个很好的问题Catch block is not being evaluated when exceptions are thrown from finallys 正在讨论在 finally 块中引发异常的一些有时意想不到的结果。

我想不出你为什么要在 finally 块中抛出异常的任何充分理由。如果之前有异常,它总是会丢失。我一直看到 finally 习惯于以不应该抛出异常的方式进行清理。

谁能解释什么时候在 finally 块中抛出异常合适?

【问题讨论】:

  • finally 内部抛出的异常将被调用者所在的相应 catch 块捕获。但正如秘鲁所说,当它更安全、更清洁时,你为什么还要考虑把事情搞砸呢?最后是收拾烂摊子,不要让它变得更多。
  • 你提到的线程从清理代码抛出异常的点开始......不是通过throw并且与开发人员的期望相反......所以是有一个问题'是否从 finally 块中抛出异常以及何时'?估计不是……
  • 在那篇原始帖子stackoverflow.com/questions/12150994/… 中,我给出了一个答案,说要将finally 块的内容包装到try..catch 中,以避免finally 块中出现任何可能的异常......而我仍然认为,应该这样做,如果有人警告 finally 块可能会抛出异常
  • 如果 WCF 的人知道这不是从 finally 抛出的好主意,也许他们不会添加那个破 .Dispose()

标签: c# exception try-catch-finally


【解决方案1】:

很好,.NET 很好地支持。问题是捕获异常,这是一个非常糟糕的做法。您正确恢复程序状态的几率非常低。

【讨论】:

  • 你是说从 finally 中抛出异常可以,但不能捕获 finally 块抛出的异常?我不遵循推理。这不是总是导致应用程序关闭吗?
  • 当然。这就是你想要的。如果您无法将程序的状态恢复到引发异常的代码开始运行之前的状态,则您无法处理异常。请务必避免假设应始终捕获异常。
【解决方案2】:

当你有一个 Exception finally 被抛出时,它会向上传播,最重要的是在 Exception 被抛出的点停止,所以 finally 的其余部分不会被执行。此外,如果 try 块中发生异常,它会消失,并且当前的异常将从 finally 块中抛出。

我无法想到任何情况,例如您最终会抛出Exception,然后出于特定原因在调用者级别处理它(可能有其他管理此类逻辑的方法),这样您就可以在调用者级别进一步基于抛出的Exception 处理。

我只能说,以后所有阅读并尝试遵循代码的眼睛都会有一个健康的惊喜。

【讨论】:

    【解决方案3】:

    try catch finally 是非常重要的构造。可以肯定的是,即使抛出异常,finally块中的代码也会被执行。处理外部资源以释放它们非常重要。垃圾收集不会为您做到这一点。在 finally 部分中,您不应该有 return 语句或抛出异常。可以这样做,但这是一种不好的做法,可能会导致不可预知的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      相关资源
      最近更新 更多