捕获ThreadAbortException并且不执行任何操作是否有意义?

时间:2011-01-10 21:14:39

标签: .net exception-handling

catch (ThreadAbortException)
{ }
catch (Exception ex)
{
    TraceManager.TraceException(ex,
                                (int)ErrorCode.GENERIC_EXCEPTION,
                                ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl);
}

即使拥有

也没有意义
catch (ThreadAbortException)
{ }

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

5 个答案:

答案 0 :(得分:34)

ThreadAbortException无法“完全”被抓住;它将在catch块的末尾自动重新播放(请参阅链接的MSDN文档页面),除非先调用 Thread.ResetAbort

因此,唯一明智的catch阻止是:

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

但这有一种非常邪恶的气味。可能没有理由这样做,所以你可能想重新考虑你的方法。

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

This one和我在这里给出的答案相同。 This one有一个答案,扩展为“除非克苏鲁正在崛起,否则不要打电话给Thread.Abort”(我大大降低了“恶臭”)。

还有很多其他人。

答案 1 :(得分:5)

无法像那样捕获ThreadAbortException。它将在catch块的末尾自动重新生成,除非您调用Thread.ResetAbort();

拥有一个用于ThreadAbortException的catch块允许它自动重新抛出,而catch(Exception)块不会尝试处理它。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

答案 4 :(得分:-3)

它会被抓住并丢失。你应该只捕获你可以做某事或者你记录然后重新抛出的异常(使用throw;而不是抛出新的[some exception];)。