首先要要知道,结构化异常处理(SEH)和C++提供的异常处理不相同。

一.Termination Handlers
Termination Handlers使用很简单。在想使用SEH处理的地方使用
__try{/* [__leave;] */}
__finally{/* [AbnormalTermination] */}
即可。
SEH保证,无论__try中的代码怎样退出(正常执行完毕、retrun、goto、异常等等),都能保证__finally中的代码被执行。
1.在__try块之外的代码则没有这种特性。另外,TerminateThread或者TerminateProcess则使程序没有机会执行__finally里的代码;
2.如果__finally块中有return语句,那么将不会执行其他return语句;
3.因此应尽量少在__try块中放置return、goto等语句,在__finally语句中同样如此;
4.尽量使用__leave代替不可避免的return,__leave不会增加系统开销;
5.AbnormalTermination只用在__finally块中,如果是正常控制流进入__finally块,那么此函数返回FALSE,否则返回TRUE.

我们已经看到结束处理程序在补救t r y块中的过早退出的执行方面很有效,但也看到结束处理程序由于要阻止t r y块的过早退出而产生了我们不希望有的结果。更好的办法是在结束处理程序的t r y块中避免任何会引起过早退出的语句。实际上,最好将r e t u r n、c o n t i n u e、b r e a k、g o t o等语句从结束处理程序的t r y块和f i n a l l y块中移出去,放在结束处理程序的外面。这样做会使编译程序产生较小的代码,因为不需要再捕捉t r y块中的过早退出,也使编译程序产生更快的代码(因为执行局部展开的指令也少)。另外,代码也更容易阅读和维护。

二.Exception Handlers and Software Exceptions
__try{/* ... */}
__except(filter){/* ... */}

1.__except可以指定要过滤的条件,也可以是一个过滤函数。过滤函数返回3个异常之一;
2.与__finally不同的是,执行过__except块中的代码后,将继续执行该块之后的代码;
3.注意在与__except块配对的__try块中嵌套__finally时的情形(先执行所有__except块对应的__try块里的__finally,然后最终执行__except);
4.在__finally中写入return,可以阻止继续执行__except;
5.如果过滤函数返回EXCEPTION_CONTINUE_EXECTION,那么将不执行__except中的代码,而是返回到出现异常的代码,重新执行本条代码;
6.如果fliter是EXCEPTION_CONTINUE_SEARCH,那么本__except不处理该异常,继续像上层查找。如果所有的__except都没有处理EXCEPTION_EXECUTE_HANDLER,那么最终系统将调用UnhandledExceptionFilter,用来显示未处理异常的对话框,并让用户选择是否调试等等。如果用户选择了调试,那么UnhandledExceptionFilter就运行调试器进程,并附加本进程id作为参数,调试开始了;
7.fliter中可以通过GetExceptionCode获取异常的代码,这很有用滴.PS:不能再过滤函数里调用此函数哦;
8.可以通过调用GetExceptionInformation()能获取更详细的异常时信息,比如寄存器等等,同样,也只能在filter中调用;
9.通过调用RaiseException来触发一个软件异常。

三.C++异常和结构化异常
在VC++中,如果你使用了C++的try、catch等等,会自动被转化为SEH。例如,throw被转化为RaiseException,而catch则是__except。

转载于:https://www.cnblogs.com/yoran/archive/2008/03/04/1090379.html

windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)相关推荐

  1. 转 windows核心编程 学习笔记 目录

    windows核心编程--SEH(结构异常处理) SEH 的工作原理.         Windows 程序设计中最重要的理念就是消息传递,事件驱动.当GUI应用程序触发一个消息时,系统将把该消息放入 ...

  2. windows核心编程学习笔记(六)动态链接库

    动态链接库有很多优点: •扩展了应用程序的特性 •可以用许多种编程语言来编写 •简化了软件项目的管理 •有助于节省内存 •有助于资源的共享 •有助于应用程序的本地化 •有助于解决平台差异 •可以用于一 ...

  3. Windows核心编程学习笔记

    字符串处理 strcpy和wcscpy不安全,是因为无法判断缓冲区最大长度的参数,不知道是否会破坏内存 一个进程-> 一个内核对象+一个地址空间 每个对象只是一个内存块 文件地址包括字节偏移量. ...

  4. 堆栈——Windows核心编程学习手札之十八

    堆栈 --Windows核心编程学习手札之十八 堆栈可以用来分配许多较小的数据块,可以不考虑分配粒度和页面边界之类的问题,但分配和释放内存块的速度比其他机制要慢,并且无法直接控制物理存储器的提交和回收 ...

  5. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  6. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  7. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  8. 结束处理程序——Windows核心编程学习手札之二十三

    结束处理程序 --Windows核心编程学习手札之二十三 使用SEH可以只关注程序要完成任务,而运行中发生的错误,系统将会发现并通知.Windows引入SHE是为了便于操作系统的开发,使用SHE所造成 ...

  9. 插入DLL和挂接API——Windows核心编程学习手札之二十二

    插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...

最新文章

  1. Java pinyin4j 汉字转拼音包括——多音字
  2. CUDA Samples: dot product(使用零拷贝内存)
  3. Oracle job procedure 存储过程定时任务
  4. 无线充电系统在输出部分采用LCC拓扑结构综述研究
  5. 2017.5.23 -- 学习记录
  6. C#调用带结构体指针的C Dll的方法
  7. win7系统稳定测试软件,win7系统电脑测试cpu性能的方法(图文)
  8. 通过docker build --build-arg 传值进 Dockerfile 动态构建容器
  9. 暴力/图论 hihoCoder 1179 永恒游戏
  10. 对于python命令行参数使用,你应该这么做才专业
  11. 多路查找树之2-3树的删除原理 - 数据结构和算法81
  12. 无需安装配置,多操作系统支持数据库及性能测试
  13. ZedGraph webform 初学小例子 (代码有详细解释)
  14. 顺应“互联网+医疗”大势 富春云携手阿里云打造云 PACS 项目
  15. 【计算机组成原理之存储系统】超级详细
  16. Ubuntu 更改环境变量 PATH
  17. osmdroid 6.0.1加载天地图在线矢量和影像数据
  18. 服务器自动关机重启1076,状态服务器上的事件 ID 1072 或1076 - ASP.NET | Microsoft Docs...
  19. python加密安装方法_安装Python加密错误
  20. 套壳截图王用户服务协议

热门文章

  1. 李开复评价马斯克:他真正的目的是把人变成半机械人
  2. zookeeper伪集群(在一台机器上集群)
  3. Struts2教程9:实现自已的拦截器
  4. Camera Calibration 相机标定:原理简介(三)
  5. 一个10年SEO工作者的35个SEO经验
  6. python中的魔术方法
  7. Redis数据库 【总结笔记】
  8. 【R】语言第五课----画图
  9. python面向对象实现简易银行管理员页面系统
  10. iOS 抓包工具 charles工具