| __try { ...//可能导致异常的被监控代码块 } __except(filter-expression) { ...//异常处理函数 } |
| __try { ... } __finally { ...//终止 } |
| //例4-1 #include "stdio.h" void main() { int* p = NULL; // 定义一个空指针 puts("SEH begin"); __try { puts("in try"); __try { puts("in try"); *p = 0; // 引发一个内存访问异常 } __finally { puts("in finally"); } } __except(puts("in filter"), 1) { puts("in except"); } puts("SEH end"); } |
| SEH begin in try //执行__try块 in try //执行嵌入的__try块 in filter //执行filter-expression,返回EXCEPTION_EXECUTE_HANDLER in finally //展开嵌入的__finally in except //执行对应的__except块 SEH end //处理完毕 |
| SEH begin in try //执行__try块 in try //执行嵌入的__try块 in filter //执行filter-expression,返回EXCEPTION_CONTINUE_SEARCH in finally //展开嵌入的__finally |
![]() 图3 不能被正确执行的SEH |
| //例4-2 #include "stdio.h" void main() { int* p = NULL; // 定义一个空指针 puts("SEH begin"); __try { __try { puts("in try"); __try { puts("in try"); *p = 0; // 引发一个内存访问异常 } __finally { puts("in finally"); } } __except(puts("in filter"), 0) { puts("in except"); } } __except(puts("in filter"), 1) { puts("in except"); } puts("SEH end"); } |
| SEH begin in try //执行__try块 in try //执行嵌入的__try块 in filter1 //执行filter-expression,返回EXCEPTION_CONTINUE_SEARCH in filter2 //执行filter-expression,返回EXCEPTION_EXECUTE_HANDLER in finally //展开嵌入的__finally in except2 //执行对应的__except块 SEH end //处理完毕 |
| SEH begin in try //执行__try块 in try //执行嵌入的__try块 in filter //执行filter-expression,返回EXCEPTION_CONTINUE_EXECUTION in filter in filter in filter in filter …//疯狂输出"in filter" |
| 异常处理 | 支持语言 | 是否标准 | 复杂度 | 推荐使用 |
| C异常处理 | C语言 | 标准C | 简单 | 推荐 |
| C++异常处理 | C++语言 | 标准C++ | 较简单 | 推荐 |
| MFC异常处理 | C++语言 | 仅针对MFC程序 | 较简单 | 不推荐 |
| SEH异常处理 | C和C++语言 | 仅针对Microsoft编译环境 | 较复杂 | 不推荐 |