news 2026/6/15 19:44:31

Windows SEH之全局展开

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows SEH之全局展开

Windows SEH之全局展开

这里说说SEH中让人费解的全局展开部分。在此之前先复习一下结构化异常处理的流程:

当异常过滤程序的计算结果为EXCEPTION_EXECUTE_HANDLER时,系统会执行全局展开。

下面这张图片展示了全局展开的流程图(对应上图中全局展开的部分):

当一个异常出现的时候,会从检查当前异常的try块是否可以处理该异常(也就是看看是不是有except块,且Filter的计算结果是否为EXCEPTION_EXECUTE_HANDLER),如果不可以则检查当前try块中是否有finally块,有则执行,然后沿着调用链向上查找(也就是看看上级函数中是否有try-except块可以处理该异常)。如果找到可以处理该异常的except块,则执行异常处理程序,执行结束后从异常处理程序的下一条语句开始继续运行。

示例分析一

下面来看一个例子:

#include<iostream>#include<Windows.h>intExceptionFilter(){std::cout<<"ExceptionFilter"<<std::endl;returnEXCEPTION_EXECUTE_HANDLER;}voidfuncA(){__try{std::cout<<"funcA try"<<std::endl;// exception*(PBYTE)NULL=5;std::cout<<"funcA try end"<<std::endl;}__except(ExceptionFilter()){std::cout<<"funcA ExceptionFilter"<<std::endl;}}voidfuncB(){__try{std::cout<<"funcB try"<<std::endl;funcA();std::cout<<"funcB try end"<<std::endl;}__finally{std::cout<<"funcB finally"<<std::endl;}}voidfuncC(){__try{std::cout<<"funcC try"<<std::endl;funcB();std::cout<<"funcC try end"<<std::endl;}__finally{std::cout<<"funcC finally"<<std::endl;}}intmain(intargc,charconst*argv[]){// C -> B -> AfuncC();return0;}

运行结果如下:

示例分析二

#include<iostream>#include<Windows.h>intExceptionFilter(){std::cout<<"ExceptionFilter"<<std::endl;returnEXCEPTION_EXECUTE_HANDLER;}voidfuncA(){__try{std::cout<<"funcA try"<<std::endl;// exception*(PBYTE)NULL=5;std::cout<<"funcA try end"<<std::endl;}__finally{std::cout<<"funcA finally"<<std::endl;}}voidfuncB(){__try{std::cout<<"funcB try"<<std::endl;funcA();std::cout<<"funcB try end"<<std::endl;}__except(ExceptionFilter()){std::cout<<"funcB ExceptionFilter"<<std::endl;}}voidfuncC(){__try{std::cout<<"funcC try"<<std::endl;funcB();std::cout<<"funcC try end"<<std::endl;}__finally{std::cout<<"funcC finally"<<std::endl;}}intmain(intargc,charconst*argv[]){// C -> B -> AfuncC();return0;}

运行结果如下:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:24:35

LightOnOCR-2-1B快速部署:阿里云ECS一键安装脚本与环境校验工具

LightOnOCR-2-1B快速部署&#xff1a;阿里云ECS一键安装脚本与环境校验工具 1. 为什么你需要一个真正好用的OCR模型 你有没有遇到过这样的情况&#xff1a;手头有一堆扫描件、发票、表格或者手机拍的文档照片&#xff0c;想把里面文字快速提取出来&#xff0c;结果试了三四个…

作者头像 李华
网站建设 2026/6/15 13:20:43

语音被截断怎么办?FSMN VAD调参技巧一文讲清

语音被截断怎么办&#xff1f;FSMN VAD调参技巧一文讲清 你有没有遇到过这样的情况&#xff1a;上传一段会议录音&#xff0c;点击“开始处理”&#xff0c;结果生成的语音片段总在关键句尾突然中断——“今天这个项目要尽快推……”后面没了&#xff1b;或者客服电话里客户刚…

作者头像 李华
网站建设 2026/6/15 13:40:14

《告别单一错误码!深度定制 C++23 std::expected 错误上下文:构建具备“现场追溯”能力的工业级协程异常治理架构》

《告别单一错误码&#xff01;深度定制 C23 std::expected 错误上下文&#xff1a;构建具备“现场追溯”能力的工业级协程异常治理架构》 &#x1f680; &#x1f4dd; 摘要 (Abstract) 在高性能 C 系统中&#xff0c;错误处理的质量直接决定了运维与调试的效率。传统的枚举错…

作者头像 李华
网站建设 2026/6/15 13:52:23

低成本高效方案:单卡显存占用控制在22GB以内

低成本高效方案&#xff1a;单卡显存占用控制在22GB以内 在大模型微调实践中&#xff0c;显存瓶颈始终是横亘在个人开发者和中小团队面前的一道高墙。动辄40GB以上的A100/H100显卡不仅价格高昂&#xff0c;更带来部署复杂度与运维成本的指数级上升。而本方案验证了一条切实可行…

作者头像 李华
网站建设 2026/6/15 13:51:45

智能小车运动控制详解:L298N电机驱动模块全面讲解

以下是对您提供的博文《智能小车运动控制详解:L298N电机驱动模块全面讲解》进行 深度润色与结构重构后的专业级技术文章 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然如资深嵌入式工程师现场授课 ✅ 摒弃“引言/概述/总结”等模板化结构,以真实工程问题…

作者头像 李华
网站建设 2026/6/15 18:27:22

CANFD与CAN的区别:错误帧检测电路差异

以下是对您提供的技术博文进行 深度润色与专业重构后的版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、有“人味”,像一位资深车载通信工程师在技术分享; ✅ 所有模块有机融合,摒弃刻板标题(如“引言”“总结”),以逻辑流驱动叙述; ✅ 核心差…

作者头像 李华