C# – 线程中止异常(线程中止异常)重新抛出本身

前端之家收集整理的这篇文章主要介绍了C# – 线程中止异常(线程中止异常)重新抛出本身前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有当前的代码
  1. class Program
  2. {
  3. private static void Main()
  4. {
  5. while (true)
  6. {
  7.  
  8. try
  9. {
  10. Thread.CurrentThread.Abort();
  11. }
  12. catch (ThreadAbortException)
  13. {
  14. Console.WriteLine("Abort!");
  15. Thread.ResetAbort();
  16. }
  17.  
  18.  
  19. Console.WriteLine("now waiting");
  20. Console.ReadKey();
  21. }
  22. }
  23. }

现在我知道方法ResetAbort应该是阻止ThreadAbortException继续重新抛出自己,即使一个catch语句捕获它,但我的问题是这样的:

如果有人可以使用ResetAbort方法,那么异常的重点是特别重新抛出呢?

用户只能做

  1. catch (ThreadAbortException ex)
  2. {
  3. Console.WriteLine("Abort!");
  4. throw ex;
  5. }

解决方法

ThreadAbortException本身的重点是确保线程终止,除非用户显式调用ResetAbort.

让我解释:

  1. try
  2. {
  3. // ... Thread abort happens somewhere in here
  4. }
  5. catch (Exception ex)
  6. {
  7. _log.Error(ex);
  8. }

这里有一个典型的代码示例,确保没有异常从try块内传播.我知道捕获异常是不好的做法,但是这样的代码仍然存在.

如果在线程位于try块中时调用Abort,您仍然希望它中止.你根本无法依赖用户在任何地方写这种代码

  1. try
  2. {
  3. // ... Thread abort happens somewhere in here
  4. }
  5. catch (ThreadAbortException)
  6. {
  7. throw; // No,you'll NEVER see code like this in real life
  8. }
  9. catch (Exception ex)
  10. {
  11. _log.Error(ex);
  12. }

所以,为了提供一种可靠的中止,异常必须被自动重新抛出,否则很容易被意外丢弃.

ResetAbort是特别检测线程中止时非常罕见的情况,并且您确切知道为什么它会发生,并且您想要防止它.

不用说,这个用例非常少见.线程中止由运行时以非常特殊的方式处理,您应该尽可能避免它们.他们甚至不能像你指出的那样可靠,所有这些讨论都忽视了更糟糕的CER.

猜你在找的C#相关文章