catch (ThreadAbortException)
{ }
catch (Exception ex)
{
TraceManager.TraceException(ex,
(int)ErrorCode.GENERIC_EXCEPTION,
ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl);
}
即使拥有
也没有意义catch (ThreadAbortException)
{ }
或会导致ThreadAbortException
被吞并并永远丢失?
答案 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];)。