异常处理得与失-精选课件(公开).ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
异常处理得与失 张银奎 yinkui.zhang@ 摘要 异常机制为处理软件执行过程中的“意外”情况提供了一种重要手段,但它是否可以取代传统的错误处理方法呢?C++语言规范定义了异常处理,但没有规定如何来实现。操作系统是如何分发异常的,异常处理的开销有多大呢?本演讲以Windows操作系统和Visual C++编译器为例层层剥茧,由浅入深的回答了以上问题,比较深入的探讨了如何在软件开发中正确的使用异常处理机制,并以实验数据和演示分析了滥用异常处理会导致的严重问题。 目录 异常过程 未处理的异常 异常处理的开销 观点和建议 异常来源 CPU检测到的执行错误 除0,GP,无效指令 程序产生 Int 3, throw E Machine Check Exceptions 总线错误,ECC错误,Cache错误 异常来源 分类 C++异常处理(EH) C++标准,关键字:try, catch, throw 结构化异常处理(SEH) Structured Exception Handling Windows操作系统的异常机制 具体实现依赖于编译器:__try, __except, __finally 向量式异常处理(VEH) Vectored Exception Handling Windows XP引入,对SEH的补充 异常处理五阶段 发生 表征 捕捉分发 处理 EXCEPTION_CONTINUE_SEARCH (0) EXCEPTION_EXECUTE_HANDLER (1) EXCEPTION_CONTINUE_EXECUTION (-1) 善后 恢复(resuming exception) 终止(terminating exception) 异常处理五阶段 - SEH int filter(void) { /* Stage 4 */ } int main(void) { __try { if (some_error) /* Stage 1 */ RaiseException(...); /* Stage 2 */ /* Stage 5 of resuming exception */ } __except(filter()) /* Stage 3 */ { /* Stage 5 of terminating exception */ } return 0; } 异常处理五阶段 - EH int main(void) { try { if (some_error) /* Stage 1 */ thow E(); /* Stage 2 */ } carch(E) /* Stage 3 */ { /* Stage 4 */ } /* Stage 5 */ return 0; } 主动抛出异常 CxxThrowException #define CXX_FRAME_MAGIC 0#define CXX_EXCEPTION 0xe06d7363 VOID NTAPI _CxxThrowException ( IN PVOID Object, IN PVOID CxxExceptionType ) { ULONG_PTR ExceptionInformation[3]; ExceptionInformation[0] = CXX_FRAME_MAGIC; ExceptionInformation[1] = (ULONG_PTR) Object; ExceptionInformation[2] = (ULONG_PTR) CxxExceptionType; RaiseException( CXX_EXCEPTION, EXCEPTION_NONCONTINUABLE, 3, ExceptionInformation ); } RaiseException VOID NTAPI RaiseException ( IN ULONG ExceptionCode, IN ULONG ExceptionFlags, IN ULONG NumberParameters, IN CONST ULONG_PTR *ExceptionInformation ) { EXCEPTION_RECORD ExceptionRecord = { ExceptionCode, Excep

文档评论(0)

saodishenseng2 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档