c++在windows下可通过五种方案将seh异常转为可控异常:一、__try/__except封装;二、setunhandledexceptionfilter全局捕获;三、混合机制抛c++异常;四、veh动态注入;五、wer后台上报。

当C++程序在Windows平台运行时触发访问违规、除零错误等底层异常,系统会通过结构化异常处理(SEH)机制向进程分发异常。以下是利用SEH捕获并转化为可控C++异常的多种实现方案:
一、使用__try/__except关键字封装SEH
该方法直接嵌入Windows原生SEH语法,在函数内部建立异常过滤器,将系统级异常转换为可捕获的整型错误码或自定义结构体。
1、在需要保护的代码块外包裹__try语句块,并在其后紧跟__except表达式。
2、__except括号内填写异常过滤表达式,例如GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION用于识别内存访问违规。
3、在__except块中调用SetUnhandledExceptionFilter注册全局处理器前,先执行日志记录与堆栈快照保存。
4、通过RaiseException手动抛出带有自定义错误信息的异常,使C++ catch块可捕获其参数值。
二、设置全局未处理异常过滤器SetUnhandledExceptionFilter
该方案在进程启动时注册一次回调函数,覆盖系统默认崩溃行为,适用于捕获所有线程中未被局部__try处理的异常。
1、定义符合LPTOP_LEVEL_EXCEPTION_FILTER签名的回调函数,参数为PEXCEPTION_POINTERS指针。
2、在main或DllMain中调用SetUnhandledExceptionFilter传入该函数地址。
3、在回调函数内解析ExceptionRecord->ExceptionCode判断异常类型,如EXCEPTION_INT_DIVIDE_BY_ZERO。
4、调用MiniDumpWriteDump生成.dmp文件,并使用OutputDebugString输出关键寄存器状态。
三、结合C++异常与SEH的混合捕获机制
通过在SEH处理器中主动抛出标准C++异常,使上层业务逻辑统一使用try/catch处理,避免跨模块异常传播断裂。
1、声明一个继承自std::exception的异常类SEHException,构造函数接收DWORD ExceptionCode和PCONTEXT ContextRecord。
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
2、在__except过滤器中创建该异常实例,并调用throw SEHException(...)。
3、确保编译选项启用/EHsc且禁用/EHa以防止RTTI干扰SEH帧展开。
4、在调用栈高层使用catch(const SEHException& e)捕获,并通过e.code()获取原始SEH错误码。
四、基于VEH向量异常处理的动态注入方案
VEH允许在运行时任意时刻添加/移除异常处理器,优先级高于SEH,适合插件化错误监控模块部署。
1、调用AddVectoredExceptionHandler(TRUE, HandlerFunction)注册前置处理器,TRUE表示插入到链表头部。
2、HandlerFunction中检查ExceptionInfo->ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE判断是否可继续执行。
3、若为可恢复异常(如EXCEPTION_GUARD_PAGE),修改ContextRecord->Rip跳转至修复逻辑后再返回EXCEPTION_CONTINUE_EXECUTION。
4、对不可恢复异常,调用RemoveVectoredExceptionHandler卸载自身,再让默认SEH流程接管以避免重复处理。
五、使用Windows Error Reporting(WER)API进行后台错误上报
该方法不拦截异常流,而是配合系统WER服务完成崩溃现场采集与自动化提交,适用于合规性要求高的生产环境。
1、在程序初始化阶段调用WerRegisterRuntimeExceptionModule注册运行时模块信息。
2、通过WerAddExcludedApplication排除已知安全软件干扰,防止WER被第三方工具禁用。
3、在SetUnhandledExceptionFilter回调中构造WER_REPORT_INFORMATION结构体,填入自定义bucket ID与附加内存区指针。
4、调用WerReportCreate与WerReportSetParameter添加用户标识字段,最后执行WerReportSubmit触发异步上报。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










