众所周知,.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
正如我们所看到的,没有指令使运行时重新抛出这种类型的异常。
所以我的问题是它是如何实现的?
答案 0 :(得分:4)
它与IL没有任何关系。例外由CLR实现,它们在Windows的SEH(结构化异常处理)的本机支持之上捎带。抛出异常时运行的第一个代码是CLR中的代码。然后,它可以做它喜欢它。查找catch块并运行其代码只是其任务之一。该代码运行后会发生什么,直到CLR。
通过阅读SSCLI20源代码,您可以更深入地了解这一点。但请注意,clr / src / vm / excep.cpp肯定是最难解决的代码之一。