【问题标题】:Does it make sense to catch ThreadAbortException and perform no action?捕获 ThreadAbortException 并且不执行任何操作是否有意义?
【发布时间】:2011-01-10 21:14:39
【问题描述】:
catch (ThreadAbortException)
{ }
catch (Exception ex)
{
    TraceManager.TraceException(ex,
                                (int)ErrorCode.GENERIC_EXCEPTION,
                                ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl);
}

有没有意义呢

catch (ThreadAbortException)
{ }

或者这会导致ThreadAbortException 被吞噬并永远丢失?

【问题讨论】:

  • ThreadAbortException 将在处理程序完成时重新抛出。

标签: .net exception-handling


【解决方案1】:

ThreadAbortException 不能被“完全”捕获;它将在 catch 块的末尾自动重新抛出(请参阅链接的 MSDN 文档页面)除非首先调用 Thread.ResetAbort

所以,唯一合理的 catch 块是:

catch (ThreadAbortException)
{
    // possibly do something here
    Thread.ResetAbort();
}

但这有一种非常邪恶的气味。可能没有理由这样做,因此您可能需要重新考虑您的方法。

更新: 有很多关于SO的问题涉及Thread.Abort

This one 与我在这里给出的答案相同。 This one 的答案扩展为“除非克苏鲁正在崛起,否则永远不要打电话给 Thread.Abort”(我将其调低为“邪恶的气味”)。

还有很多其他的。

【讨论】:

  • +1:措辞挑剔。它可以被抓住——它只会被重新抛出。
  • @Hogan:改写了一下;现在意思应该更清楚了。
  • 非常好的答案。如果可以的话,我会再给它 +1。
【解决方案2】:

不能这样捕获 ThreadAbortException。除非您调用 Thread.ResetAbort(); 否则它将在 catch 块结束时自动重新抛出;

在此处为 ThreadAbortException 设置一个 catch 块可以自动重新抛出它,而无需 catch(Exception) 块尝试处理它。

【讨论】:

    【解决方案3】:

    在线程上调用Thread.Abort 有效地设置了一个标志,这将导致ThreadAbortException 在代码未处理该异常或关联finally 块时被抛出。在不调用Thread.ResetAbort() 的情况下捕获异常只会导致运行时在下一次机会时抛出另一个ThreadAbortException。然而,这种行为并非完全没有意义,因为它会导致所有内部 finally 块在外部异常过滤器块看到异常之前运行完成。这是否是一件好事将取决于应用程序。

    【讨论】:

      【解决方案4】:

      如果你想针对不同类型的异常做一些特定的事情,那么它就会有单独的 catch 块。否则你可以只使用一个异常捕获

      【讨论】:

      • 我不同意。通常最好具体说明您正在捕获的内容。我认为如果你不知道你的“try”块可能抛出什么样的异常,这意味着你没有给你的应用程序足够的测试。
      【解决方案5】:

      它会被抓住并丢失。您实际上应该只捕获可以执行某些操作或记录然后重新抛出的异常(使用 throw;而不是抛出新的 [某些异常];)。

      【讨论】:

        猜你喜欢
        • 2018-12-30
        • 2016-04-29
        • 2012-10-19
        • 2018-04-27
        • 2011-04-03
        • 2013-03-31
        • 2012-09-09
        • 1970-01-01
        • 2015-07-21
        相关资源
        最近更新 更多