ThreadAbortException内部实现

时间:2011-11-09 14:17:28

标签: .net multithreading exception-handling cil

众所周知,.NET Framework提供了ThreadAbortException处理的一些特定实现。表示无法通过try-catch-finally块捕获此异常。再深入一点看,我们知道这个异常实际上是catch,但是在catch块的最后重新抛出。 (实际上我们可以使用Thread.ResetAbort()方法防止堆栈展开。)

但是让我们来看看MSIL:

    .try
    {
      IL_0001:  nop
      IL_0002:  call       void WCFTemp.Program::Method()
      IL_0007:  nop
      IL_0008:  nop
      IL_0009:  leave.s    IL_0010
    }  // end .try
    catch [mscorlib]System.Exception 
    {
      IL_000b:  stloc.0
      IL_000c:  nop
      IL_000d:  nop
      IL_000e:  leave.s    IL_0010
    }  // end handler
    IL_0010:  nop
    IL_0011:  leave.s    IL_0016
  }  // end .try
  finally
  {
    IL_0013:  nop
    IL_0014:  nop
    IL_0015:  endfinally
  }  // end handler

正如我们所看到的,没有指令使运行时重新抛出这种类型的异常。

所以我的问题是它是如何实现的?

1 个答案:

答案 0 :(得分:4)

它与IL没有任何关系。例外由CLR实现,它们在Windows的SEH(结构化异常处理)的本机支持之上捎带。抛出异常时运行的第一个代码是CLR中的代码。然后,它可以做它喜欢它。查找catch块并运行其代码只是其任务之一。该代码运行后会发生什么,直到CLR。

通过阅读SSCLI20源代码,您可以更深入地了解这一点。但请注意,clr / src / vm / excep.cpp肯定是最难解决的代码之一。