C# – 线程中止异常(线程中止异常)重新抛出本身
发布时间:2020-12-15 07:48:50 所属栏目:百科 来源:网络整理
导读:我有当前的代码: class Program{ private static void Main() { while (true) { try { Thread.CurrentThread.Abort(); } catch (ThreadAbortException) { Console.WriteLine("Abort!"); Thread.ResetAbort(); } Console.WriteLine("now waiting"); Console.
我有当前的代码:
class Program { private static void Main() { while (true) { try { Thread.CurrentThread.Abort(); } catch (ThreadAbortException) { Console.WriteLine("Abort!"); Thread.ResetAbort(); } Console.WriteLine("now waiting"); Console.ReadKey(); } } } 现在我知道方法ResetAbort应该是阻止ThreadAbortException继续重新抛出自己,即使一个catch语句捕获它,但我的问题是这样的: 如果有人可以使用ResetAbort方法,那么异常的重点是特别重新抛出呢? 用户只能做 catch (ThreadAbortException ex) { Console.WriteLine("Abort!"); throw ex; } 解决方法
ThreadAbortException本身的重点是确保线程终止,除非用户显式调用ResetAbort.
让我解释: try { // ... Thread abort happens somewhere in here } catch (Exception ex) { _log.Error(ex); } 这里有一个典型的代码示例,确保没有异常从try块内传播.我知道捕获异常是不好的做法,但是这样的代码仍然存在. 如果在线程位于try块中时调用Abort,您仍然希望它中止.你根本无法依赖用户在任何地方写这种代码: try { // ... Thread abort happens somewhere in here } catch (ThreadAbortException) { throw; // No,you'll NEVER see code like this in real life } catch (Exception ex) { _log.Error(ex); } 所以,为了提供一种可靠的中止,异常必须被自动重新抛出,否则很容易被意外丢弃. ResetAbort是特别检测线程中止时非常罕见的情况,并且您确切知道为什么它会发生,并且您想要防止它. 不用说,这个用例非常少见.线程中止由运行时以非常特殊的方式处理,您应该尽可能避免它们.他们甚至不能像你指出的那样可靠,所有这些讨论都忽视了更糟糕的CER. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |