gpt4 book ai didi

.net - ThreadAbortException内部实现

转载 作者:行者123 更新时间:2023-12-03 13:17:53 26 4
gpt4 key购买 nike

众所周知,.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

如我们所见,没有任何指令可以使运行时重新抛出这种类型的异常。

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

最佳答案

它与IL无关。异常是由CLR实现的,它们背负于Windows对SEH(结构化异常处理)的 native 支持之上。引发异常时运行的第一个代码是CLR内部的代码。然后哪个可以做自己喜欢的事情。查找catch块并运行其代码只是其任务之一。该代码运行之后将发生什么取决于CLR。

通过阅读SSCLI20源代码,您可以对此有更多的了解。但是请注意,clr/src/vm/excep.cpp绝对是最难处理的代码之一。

关于.net - ThreadAbortException内部实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8066329/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com