【发布时间】:2011-11-09 14:17:27
【问题描述】:
众所周知,.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
正如我们所见,没有指令可以让运行时重新抛出此类异常。
所以我的问题是它是如何实现的?
【问题讨论】:
标签: .net multithreading exception-handling cil