【发布时间】:2016-03-06 00:10:54
【问题描述】:
简而言之,MSDN describes exception dispatching 用于这样的用户模式应用程序:
- 调试器收到第一次机会异常的通知(如果附加)
- 又名异常处理程序。
try/catch被调用(如果可用) - 调试器收到第二次机会异常通知(如果附加)
- 系统关心未处理的异常(通常:终止进程)
此序列不考虑未处理的异常处理程序的存在。当存在未处理的异常处理程序时,异常分派如何变化?
【问题讨论】:
-
我相信winapi 标记具有误导性,因为您只是在讨论CLR 中的异常处理。在内部,Windows 使用Structured Exception Handling。虽然 CLR 异常是根据 SEH 异常实现的,但 SEH 异常和 CLR 异常暴露了不同的语义。再说一次,您的第一个链接指向 SEH,我不确定您指的是哪个异常处理(您的答案包含 C# 代码)。
-
@IInspectable:感谢您的洞察力。我不认为这种行为是特定于语言的。好的,我们有 SEH,CLR 内部使用 SEH。我不确定语义会改变什么。让我们实际一点:你说 C++ 的答案会有所不同吗?
-
关键区别在于Exception Dispatching的第一句话:“当发生硬件或软件异常时[...]”。 C++(也可能是 C#)中的异常处理是严格同步的。
try/catch处理程序只会捕获抛出的异常。它不会捕获硬件异常。详细信息在Exception Handling Differences 下进行了概述。这个问题的答案可能应该是使用 SEH 异常过滤器的 C 语言。
标签: windows winapi exception-handling usermode