.net 异常处理上下文切换和SEH

.net 异常处理上下文切换和SEH,.net,exception-handling,.net,Exception Handling,我最近读了一些关于异常处理和.Net框架的书,这似乎让我在开始时更加困惑 通过C#4th Addition,我在CLR中读到: 另外,.NET框架 建立了异常处理机制 使用结构化异常 由提供的处理(SEH)机制 微软视窗。SEH一直在 在许多参考资料中讨论,包括 我自己的书,Windows via C/C++,第5期 ed.(微软出版社,2007年),其中 包含三章专门讨论 塞赫 现在,我的困惑开始了。如果.Net Framework是使用SEH构建的,但它仅用于未处理的异常,还是直接用于.Ne

我最近读了一些关于异常处理和.Net框架的书,这似乎让我在开始时更加困惑

通过C#4th Addition,我在CLR中读到:

另外,.NET框架 建立了异常处理机制 使用结构化异常 由提供的处理(SEH)机制 微软视窗。SEH一直在 在许多参考资料中讨论,包括 我自己的书,Windows via C/C++,第5期 ed.(微软出版社,2007年),其中 包含三章专门讨论 塞赫

现在,我的困惑开始了。如果.Net Framework是使用SEH构建的,但它仅用于未处理的异常,还是直接用于.Net中的所有异常处理?如果是,CLR在哪里适应,是从SEH获取队列,还是它自己采取行动并使用If和when

第二,从Kerrnal模式到用户模式的上下文切换是如何适应的?我知道当创建线程时它已经(从CLR通过C#)

线程环境块(TEB)TEB是分配的内存块 和 在用户模式下初始化(应用程序代码所在的地址空间 可以快速访问)。这个 TEB占用1页内存(x86和x64 CPU上为4KB,主机上为8KB) IA64 CPU)。 TEB包含线程异常处理链的头部。 每个试块 螺纹进入后,在链头插入一个节点;这个 节点被移除 当线程存在于try块中时,从链开始。此外 TEB包含 线程的线程本地存储数据以及一些数据 供用户使用的结构 图形设备接口(GDI)和OpenGL图形


以及用户模式堆栈和内核模式堆栈。但是,既然所有需要处理的内容都在同一个线程上,为什么要在任何时候进行上下文切换呢?

下面是一个关于CLR如何处理异常的非常详细的解释(我相信是CLR架构师之一):

[SEH]是否立即用于.NET中的所有异常处理

对。引发.NET异常会导致引发Win32结构化异常

为什么上下文切换需要在任何时候发生,因为它们需要处理的所有内容都在同一个线程上

当抛出异常时,线程会转换到内核模式并返回,但只涉及一个线程。内核模式不是一个单独的线程;这是一个你的线程可以访问的地方


所有Win32异常都必须通过内核进行转换。例如,调试器基础结构处于内核模式,调试器可能希望在用户模式代码看到异常之前拦截异常。

感谢链接,因为附加读取总是有用的,虽然我知道异常处理的工作方式在2005年发生了变化,特别是在异常现在被包装在CLR友好的包装器中的方式。由于这篇文章的日期是2003年,我想他是在谈论CLR V2(2005年发布),因为他是CLR开发团队的成员。不知道这是否真的改变了。谢谢!我想我可能误解了内核模式和用户模式,我认为它们属于一个线程。