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

kac*_*apy 11 .net exception-handling

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

甚至拥有它是否有意义

catch (ThreadAbortException)
{ }
Run Code Online (Sandbox Code Playgroud)

还是会导致ThreadAbortException被吞噬和永远丢失?

Jon*_*Jon 34

ThreadAbortException不能"完全"抓住; 除非首先调用,否则它将自动在catch块的末尾重新抛出(请参阅链接的MSDN文档页面). Thread.ResetAbort

所以,唯一明智的catch方法是:

catch (ThreadAbortException)
{
    // possibly do something here
    Thread.ResetAbort();
}
Run Code Online (Sandbox Code Playgroud)

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

更新: 关于SO有很多问题需要处理Thread.Abort:

这个答案与我在这里给出的答案相同. 这个答案扩大了" Thread.Abort除非克苏鲁正在上升,否则不要打电话"(我大大降低了"恶臭").

还有很多其他的.


Tob*_*oby 5

ThreadAbortException无法像这样被捕获.除非你调用Thread.ResetAbort();否则它将在catch块的末尾自动重新生成.

像这里有一个用于ThreadAbortException的catch块允许它自动重新抛出而没有catch(Exception)块试图处理它.