zoukankan      html  css  js  c++  java
  • windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)

    首先要要知道,结构化异常处理(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。

  • 相关阅读:
    【python练习题】实现字符串反转
    Oracle账号
    selenium自动化测试资源整理(含所有版本chrome、chromedriver、firefox下载链接)
    【Selenium 3+Java自动化(6)】-CSS定位语法
    【Selenium 3+Java自动化(5)】-xpath定位
    【Selenium 3+Java自动化(4)】-八种元素定位
    【Selenium 3+Java自动化(4)】- 启动IE
    【Selenium 3+Java自动化(3)】- 启动Chrome
    【Selenium 3+Java自动化(2)】- 启动firefox
    【Selenium 3+Java自动化(1)】- 环境搭建
  • 原文地址:https://www.cnblogs.com/yoran/p/1090379.html
Copyright © 2011-2022 走看看