读windows核心编程,结构化异常部分,理解摘要
来源:互联网 发布:耶族部落_永久域名 编辑:程序博客网 时间:2024/06/07 04:09
23章:
结束处理程序:
__try{}
__finally{}块语句,能保证在运行完__try的语句后能调用__finally{}块中的语句,就算是提前的return,break,continue,goto, 内存访问违规等都可以保证,但是当调用ExitThread或ExitProcess时,将立即结束线程或进程,由于调用TerminateThread或TerminateProcess而结束线程或进程,不会执行__finally块中的代码.
但是在__try块过早退出时,会导致局部展开,影响效率,应该尽量放在外面.
当碰到一些的确需要在块内部使用return时,可以先用__leave关键字代替,以直接从__try块转到__finally,并在最后调用return语句返回,这样避免了局部展开,提高了效率,但是额外的代价是需要加入一个表示函数成功完成的bool变量.
可以在__finally块中调用AbnormalTermination内部函数确定是否是非正常退出__try块,发生局部展开和内存访问违规等都算在内,此时返回true,当自然进入__finally块时,此函数返回false.可以通过这种方式决定到底在__finally块中执行什么代码.不能在其它地方调用.
此结束处理程序的作用:
简化错误处理,提高程序可读性,使代码更容易维护,使用得当具有很小的系统开销.
24章:
异常处理程序:
__try{}
__except(){}
在__try块中使用return,break,continue,goto语句不会带来额外开销.
在
__try{}
__except(EXCEPTION_EXECUTE_HANDLER){}
发生异常时,执行完__except块中的代码后,从其后的下一条语句开始执行.
__try{}
__except(EXCEPTION_CONTINUE_EXCUTION){}
发生异常时,执行完__except块中的代码后,重新从导致异常的原指令开始执行.
__try{}
__except(EXCEPTION_CONTINUE_SEARCH){}
发生异常时,不执行__except块中的代码,直接查找上一个匹配的__except块执行.
可以在_except块中和条件中调用GetExceptionCode()函数来确定到底是什么异常,不能在其它地方调用.
当一个异常发生时,操作系统向引起异常的线程的栈里压入三个结构,
EXCEPTION_RECORD, EXCEPTION_POINTERS, CONTEXT ,其中EXCEPTION_POINTERS就是两个指针成员,指向压入栈中的其它两个成员, breakpad的exinfo结构就是这个指针的类型.并且成员和含义完全一样.
GetExceptionInformation函数只能在异常过滤器中使用,也就是__except的条件中调用.块中都不能使用.但是可以想办法在异常过滤器中就将结果保存下来,放到以后使用.
软件异常:
可以由void RaiseException(
DWORD dwExceptionCode,
DWORD dwExceptionFlags,
DWORD nNumberOfArguments,
const ULONG_PTR* lpArguments
);
引发.但是dwExceptionCode要遵循winerror.h文件中定义的一样的规则.
第二参数为是否允许异常过滤器返回EXCEPTION_CONTINUE_EXCUTION的标志位,当设为0为允许,设为EXCEPTION_NONCONTINUABLE为不允许,当不允许的时候,异常过滤器返回EXCEPTION_CONTINUE_EXCUTION时,会引发新的异常EXCEPTION_CONTINUE_EXCEPTION.
在异常的时候发生新的异常,旧的异常消息会保留在EXCEPTION_RECORD的ExceptionRecord链表中.
25章:
未处理异常和c++异常
Windows内部启动线程的方式也使用了SHE框架,当一个线程发生异常的时候,首先通过UnhandledExceptionFilter(GetExceptionInformation())处理,默认方式为弹出熟悉的报错对话框,按close后通过ExitProcess(GetExceptionCode())退出,按debug即传递合适的参数CreateProcess开启新的调试进程来调试异常的程序.
通过以SEM_NOGPFAULTERRORBOX为参数调用SetErrorModel函数,可以防止显示异常消息框.通过对每个线程和主线程的try-except块包装,可以自己处理每一个异常.而不调用默认的UnhandledExceptionFilter.windows还提供SetUnhandledExceptionFilter函数来定义某个进程中所有的线程发生异常时调用的异常过滤器.此函数的参数为用户自定义的异常过滤器的指针.
在VC中,C++的异常实际用SHE来实现,并且SHE比C++异常有更多功能,比如可以从一个硬件错误中恢复过来.可以在一个程序不同函数中同时使用两套异常系统,但是不能混合使用,也不能在一个函数中使用两套系统.
- 读windows核心编程,结构化异常部分,理解摘要
- windows核心编程,结构化异常部分,理解摘要
- Windows核心编程:结构化异常处理
- windows核心编程---结构化异常处理
- Windows核心编程笔记-Windows提供的结构化异常处理(SEH)
- windows核心编程--SEH(结构异常处理)
- windows核心编程--SEH(结构异常处理)
- windows核心编程--SEH(结构异常处理)
- windows核心编程--SEH(结构异常处理)
- Windows核心编程笔记(十九) SEH结构化异常处理_未处理异常及向量化异常
- windows核心编程3(DllMain,SetWindowsHookEx,结构化异常处理等)
- 结构化异常处理(Windows核心编程学习笔记一)
- 《谈谈windows核心编程系列》 结构化异常处理SEH之__finally终止处理
- 《谈谈windows核心编程系列》 结构化异常处理SEH之__finally终止处理
- Windows核心编程笔记(十八) SEH结构化异常 一
- Windows核心编程笔记(十八) SEH结构化异常 二
- Windows核心编程笔记(十八) SEH结构化异常 三
- Windows核心编程----处理结构化异常处理(SEH)和C++提供的异常处理不相同
- 进入erlang的世界
- 再谈应用服务器和web服务器的整合
- 数学之美番外篇:快排为什么那样快
- 关于JAVA的对象序列化----------为什么要序列化
- 职业的程序员
- 读windows核心编程,结构化异常部分,理解摘要
- java串口编程的实现
- ASP.NET的三层结构指什么
- C++实现一个数组类及其stack适配器
- apache2配置优化以及性能测试小结
- SelfExtractor自解压模块理解文档
- MySQL 数据库引擎比较
- 从SEO角度谈谈网站架构的思考
- 汇编语言