理解 C 中的 __try、try/catch/finally
在 C 中,try/catch/finally 块通常用于异常处理。但是,有一种带有双下划线的替代语法 __try,它是 Windows 特有的。
何时使用 __try
在 Windows 上,异常处理是通过 Structured 实现的异常处理(SEH)。当使用 MSVC 编译器面向 Windows 时,__try 语法可用于捕获 SEH 异常。
SEH 和 C 异常
MSVC 编译器生成将 C 异常映射到的代码SEH 基础设施,使用异常代码 0xe06d7363(“msc”)。这允许在引发 SEH 异常时调用 C 析构函数。
析构函数的编译器优化
MSVC 编译器优化代码以避免生成析构函数代码(如果存在)对象的生命周期内没有 throw 语句。这种优化可以通过使用 /EHa 编译选项来抑制,这是一致地捕获所有 SEH 异常所必需的。
SEH 异常类型
SEH 有许多异常类型,包括操作系统定义的和特定应用程序使用的。托管异常,例如 .NET 异常,使用异常代码 0xe0434f4d ("com")。
__try、__except 和 __finally
要捕获 SEH 异常,__try与 __except 结合使用,它的作用类似于 C catch 块,但具有更多功能。 __finally 允许在异常处理后执行代码。
示例代码
提供的代码演示了如何使用 __try、__except 和 __finally 来捕获两个 SEH 异常(由访问空指针引起)和 C 异常(由抛出整数引起)。
输出显示为这两个异常调用了析构函数,并且 __ except 成功捕获了异常。
以上是C 在 Windows 上 __try 的目的和实现是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!