Microsoft C++ 编译器提供了一组语言扩展,其中 try-except 语句用于处理 Windows 结构化异常(SEH)。这类异常由操作系统在运行时产生,例如非法内存访问、除零错误等,和标准 C++ 异常属于不同体系。通过 try-except,开发者可以在不依赖标准异常机制的情况下拦截并处理这些底层错误。

try-except 基本语法
try-except 由 __try 块和 __except 过滤器组成,语法形式如下:
__try {
// 可能触发结构化异常的代码
}
__except (filter_expression) {
// 异常处理代码
}
其中 filter_expression 在异常发生时被求值,它必须返回以下三个值之一:
- EXCEPTION_EXECUTE_HANDLER(1):执行
__except块。 - EXCEPTION_CONTINUE_SEARCH(0):当前块不处理,继续向外层搜索。
- EXCEPTION_CONTINUE_EXECUTION(-1):恢复出错指令重新执行。
一个简单示例
下面代码演示了捕获除零错误的结构化异常:
#include <windows.h>
#include <stdio.h>
int main() {
int a = 0;
__try {
int b = 10 / a; // 触发除零异常
printf("result=%dn", b);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
printf("捕获到结构化异常n");
}
return 0;
}
过滤器表达式的写法
过滤器可以是常量,也可以调用函数。通常使用 GetExceptionCode() 判断异常类型:
#include <windows.h>
int filter_divide() {
if (GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO) {
return EXCEPTION_EXECUTE_HANDLER;
}
return EXCEPTION_CONTINUE_SEARCH;
}
void test() {
__try {
int x = 1 / 0;
}
__except (filter_divide()) {
// 仅处理除零
}
}
与标准 try-catch 的区别
| 对比项 | try-except | try-catch |
|---|---|---|
| 异常来源 | 操作系统 SEH | C++ 标准异常 |
| 是否标准 | 微软扩展 | ISO C++ |
| 类型信息 | 通过代码判断 | 通过类型匹配 |
使用注意事项
在 __try 块中不要调用会抛出 C++ 对象的函数,否则可能导致对象析构不被执行。另外,结构化异常不应作为普通控制流使用,只适合处理真正意外的底层错误。若需跨模块,应确保编译选项一致,避免运行时行为差异。
谨慎使用 EXCEPTION_CONTINUE_EXECUTION,因为并非所有硬件异常都能安全恢复。
小结
try-except 是 Microsoft C++ 中处理结构化异常的重要扩展,理解其过滤机制和限制,可以在 Windows 原生开发中提升程序容错能力。
try_except结构化异常Microsoft_C++修改时间:2026-07-25 18:24:19