我在一个遗留项目中工作,该项目在许多方法中都有这种异常处理代码。
catch(ThreadAbortException e)
{
...
}我在项目的Thread.Abort()或Thread.Interrupt()调用中看不到任何地方。删除所有这些ThreadAbortException处理是否安全,或者可以通过其他方式引发。
发布于 2016-06-18 23:45:05
官方文档:“当调用Abort方法时抛出的异常。”如果您完全确定没有对Thread.Abort的调用,那么您也可以擦除这些catch块。
编辑:请注意,您的代码可能在外部应用程序的上下文中运行,该应用程序可能会在您的线程上调用Thread.Abort。
这并不是说这很重要,因为ThreadAbortException不能真正被处理,因为CLR本身会重新抛出它,以便尽快实际杀死线程。
“实际上是的,ThreadAbortException是特殊的。即使你处理了它,它也会在try/catch/finally的末尾被CLR自动重新抛出。(正如评论中所指出的,它可以被ResetAbort禁止,但到那时代码就会闻起来像腐烂的鱼。)”-阅读这个问题了解更多细节:ThreadAbortException
发布于 2016-06-19 00:03:38
好吧,如果具体回答你的问题,我会说删除这些异常处理程序更好的方式是而不是,因为它们很可能是由一些试图解决问题的开发人员添加的。我认为添加这些处理程序是有原因的,所以如果只删除这些代码,可能会导致将来再次出现一些bug。
关于ThreadAbordException:我确信它不仅可以在你调试时调用Thread.Abort()方法抛出(我不确定这可能是VS中的一个bug ),而且它会迫使你的程序静默地崩溃。因此,根据这些处理程序内部的内容,开发人员可能正在尝试解决此类问题。
还请记住,您也可以在单独的线程中调用第三方库、web服务等的方法。我不确定他们是否可以抛出这样的异常,但这是一个可以考虑的情况。
发布于 2016-06-19 00:46:38
项目是否在主线程上运行并启动后台工作线程?如果主线程在后台线程运行时退出,则会在后台线程上发生ThreadAbortedException。
catch语句可以以不同于任何其他异常的方式专门处理这种情况,在这种情况下,后台线程上实际上没有发生错误。
https://stackoverflow.com/questions/37898650
复制相似问题