在Windows系统中,C++程序可能因为空指针访问、内存越界或除零操作而直接崩溃。通过结构化异常处理(SEH),我们可以在系统终止进程前捕获这些异常,进行日志记录或资源清理。SEH由Windows操作系统提供,不依赖C++标准库,因此适用于各类原生程序。

什么是SEH
SEH全称为Structured Exception Handling,是Windows提供的底层异常处理机制。它使用__try、__except和__finally关键字,能够捕获CPU级异常,例如STATUS_ACCESS_VIOLATION。与C++的try-catch不同,SEH可以处理系统级错误。
使用try-except捕获异常
通过__try和__except构造保护块,异常过滤器决定如何处理异常。过滤器返回EXCEPTION_EXECUTE_HANDLER时会进入处理块。
#include <windows.h>
#include <stdio.h>
int main() {
__try {
int* p = NULL;
*p = 10; // 触发访问违规
}
__except(EXCEPTION_EXECUTE_HANDLER) {
printf("捕获到异常,代码: %xn", GetExceptionCode());
}
return 0;
}
获取异常详细信息
在过滤器函数中,可以使用GetExceptionInformation获取异常指针,从而读取错误地址和上下文。
#include <windows.h>
#include <stdio.h>
LONG WINAPI Filter(EXCEPTION_POINTERS* ep) {
printf("异常地址: %pn", ep->ExceptionRecord->ExceptionAddress);
return EXCEPTION_EXECUTE_HANDLER;
}
int main() {
__try {
int a = 0;
int b = 1 / a; // 除零异常
}
__except(Filter(GetExceptionInformation())) {
printf("已处理异常n");
}
return 0;
}
常见异常代码对照
| 异常宏 | 含义 |
|---|---|
| EXCEPTION_ACCESS_VIOLATION | 内存访问违规 |
| EXCEPTION_INT_DIVIDE_BY_ZERO | 整数除零 |
| EXCEPTION_STACK_OVERFLOW | 栈溢出 |
注意事项
- SEH不能与C++对象析构安全混用,__except块中抛出异常可能导致资源泄漏
- 建议在顶层设置全局异常过滤器SetUnhandledExceptionFilter处理未捕获崩溃
- 获取上下文后可用MiniDumpWriteDump生成dump文件便于分析
SEH是系统级工具,适合写崩溃保护外壳,不应替代常规错误检查逻辑。
总结
利用SEH,C++开发者可以在Windows上拦截大多数致命错误,结合异常过滤器和转储函数,能够显著提升程序的健壮性与可维护性。
C++SEHWindows异常处理修改时间:2026-07-26 07:45:17