__try, __except(exception filter)

一、异常过滤器(exception filter)和异常处理程序

一、异常过滤器中使用逗号(,)操作符。从左到右执行,返回最右边表达式的结果。

二、异常处理程序,在try块中可以使用return, goto, continue, break等,不会产生速度和代码规模方面的不良影响(与结束处理程序不同)。

三、过滤器(表达式的值)的标识符(只有三个):

n         EXCEPTION_EXECUTE_HANDLER      1:

进行全局展开,执行except块中的异常处理代码后继续执行应用程序except后的其他代码

n         EXCEPTION_CONTINUE_EXECUTION   -1:

告诉系统跳回到产生异常的指令,试图再执行一次。(你必须在异常处理程序中处理这个异常,否则产生死循环)

n         EXCEPTION_CONTINUE_SEARCH      0:

告诉系统去查找前面一个except块相匹配的try块,并调用这个try块的异常处理。(用于告诉系统我们在这个except块中未处理这个异常,在C25中作了进一步的说明:如果每个过滤器都这样返回,则是未处理异常,unhandled exception,将导致线程和进程终止。)

二、获取异常代码:

DWORD GetExceptionCode();       // 在WinBase.h中预定义了所有的异常。不能在过滤器函数内部调用,合法用例:

__except(ExceptFilter(GetExceptionCode())){ …… }       或

__except( (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ) || GetExceptionCode() ==  EXCEPTION_INT_DIVIDE_BY_ZERO) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH  )

{ …… }

1.         与内存有关的:

n         EXCEPTION_ACCESS_VIOLATION      // 试图对虚拟地址读写

n         EXCEPTION_DATATYPE_MISALIGNMENT   // 未对齐数据I/O

n         EXCEPTION_ARRAY_BOUNDS_EXCEEDED   // 越界的数组

n         EXCEPTION_IN_PAGE_ERROR            // 页故障

n         EXCEPTION_GUARD_PAGE   // 对PAGE_GUARD保护属性的内存页I/O

n         EXCEPTION_STACK_OVERFLOW   // 栈溢出

n         EXCEPTION_ILLEGAL_INSTRUCTION   // 执行了无效指令

n         EXCEPTION_PRIV_INSTRUCTION   // 执行了当前机器模式不允许的指令

2.         与异常相关的:

n         EXCEPTION_INVALID_DISPOSITION   // 异常过滤器返回值非三者之一

n         EXCEPTION_NONCONTINUABLE_EXCEPTION // 对不能继续的异常返回EXCEPTION_CONTINUE_EXCUTION

3.         与调试相关的:

n         EXCEPTION_BREAKPOINT   //   遇到断点

n         EXCEPTION_SINGLE_STEP   //   单步指令执行完毕

n         EXCEPTION_INVALID_HANDLE   // 传递无效句柄

4.         与整数相关的:

n         EXCEPTION_INT_DIVIDE_BY_ZERO   // 用0作除数

n         EXCEPTION_INT_OVERFLOW         // 结果超过整数范围

5.         与浮点数相关的:

n         EXCEPTION_FLT_DENORMAL_OPERAND   // 浮点操作中的一个操作数不正常(值太小)。

n         EXCEPTION_FLT_DIVIDE_BY_ZERO   // 用0作除数

n         EXCEPTION_FLT_INEXACT_RESULT   // 不能精确表示成10进制小数

n         EXCEPTION_FLT_INVALID_OPERATION   // 其他浮点数异常

n         EXCEPTION_FLT_OVERFLOW      // 大于允许的值

n         EXCEPTION_FLT_STACK_CHECK   // 栈溢出或下溢

n         EXCEPTION_FLT_UNDERFLOW   // 小于允许的值

三、异常代码构成规则(WinError.h中定义):

32 bit DWORD 值意义:

1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0

+---+-+-+-----------------------+----------------------------------+

|Sev|C|R|     Facility             |

Code                         |

+---+-+-+-----------------------+----------------------------------+

Sev(31-30):严重性系数

C(29):0 = 微软定义;1 = 客户定义

R(28):保留 = 0

Facility(27-16):设备代码

Code(15-0):异常代码

四、获取错误信息:

P EXCEPTION_POINTERS GetExceptionInformation();// 用于获取错误信息,只能在异常过滤器中调用!

系统在发生异常的栈中放入三个结构:

n         EXCEPTION_ROCORD:独立于CPU

n         CONTEXT:依赖于CPU(其分析要求对于不同的CPU而特殊处理)

n         EXCEPTION_POINTERS:包含两个指针,分别指向EXCEPTION_ROCORD和CONTEXT。

五、引发软件异常

VOID RaiseException(

DWORD dwExceptionCode,              //       标识引发异常的值,见上

DWORD dwExceptionFlags,              //       0或EXCEPTION_NONCONTINUABLE

DWORD nNumberOfArguments,       //       附加信息,NULL

CONST ULONG_PTR *pArguments);   //       附加信息,NULL

C24、异常处理程序和软件异常相关推荐

  1. Windows核心编程 第2 4章 异常处理程序和软件异常

    异常处理程序和软件异常 C P U引发的异常,就是所谓的硬件异常(hardware exception).操作系统和应用程序 也可以引发相应的异常,称为软件异常(software exception) ...

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

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

  3. win任务栏计算机变未知,如何解决Win7打开程序出现异常未知的软件异常

    时我们打开win7系统电脑时,上面的某个程序软件会打不开,出现错误提示"应用程序发生异常未知的软件异常,今天学习啦小编给大家介绍下如何解决Win7打开程序出现异常未知的软件异常吧. 解决Wi ...

  4. IE浏览器 应用程序发生异常 未知的软件异常(0x0000417),位置为 0x6546120

    IE浏览器   应用程序发生异常 未知的软件异常(0x0000417),位置为 0x6546120 方法一: 采用杀毒软件(360)来修复: 百度: IE浏览器   应用程序发生异常 未知的软件异常( ...

  5. 多玩我的世界java异常_应用程序发生异常 未知的软件异常解决办法大全

    应用程序出错了怎么办?很多朋友都遇到过:应用程序发生异常 未知的软件异常(0X????????),位置为0x????????.或者是"0x????????"指令引用的"0 ...

  6. 应用程序错误:应用程序发生异常未知的软件异常(0x0eedfade),位置为0x7c812aeb解决方案

    [问题描述]:      弹出应用程序: Explorer.EXE - 应用程序错误: 应用程序发生异常 未知的软件异常 (0x0eedfade),位置为 0x7c812aeb [解决方案]:     ...

  7. 运行dxp.exe运行时,软件出现:应用程序发生异常 未知的软件异常 (0x0eedfade),位置为 0x7c812afb的处理方法

    运行软件出现:应用程序发生异常 未知的软件异常 (0x0eedfade),位置为 0x7c812afb的处理方法     有极少部分用户反映主程序无法运行,一运行就报错:"应用程序发生异常 ...

  8. 解决程序提示“应用程序发生异常 未知的软件异常(0x0eedfade),位置为 0x7c812fd3”

    微软于2013/11/5发布了Fix it 51004补丁,用于修复Win XP和Win 2003的office漏洞. 参考 https://support.microsoft.com/kb/2896 ...

  9. 应用程序发生异常 未知的软件异常(0x0eedfade),位置为0x7c812a5b

    最近我们一个客户打电话说,我们的客户端程序在他们的XP系统上经常出现此错误.但是我们的客户端已经装了了很多台了,是第一次碰到此问题,因此断定可能是他系统的问题,于是我就在google里搜索0x0eed ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task15. 有效的括号
  2. 一道关于宏的面试题及解答
  3. PYTHON——TCPUDP:Socket初识
  4. 『设计模式』我能进来坐坐吗?--访问者模式
  5. @程序员,你敢轻易地写 Bug 吗?
  6. Win Phone 8 Emulator启动错误:提示无法创建虚拟机,Xde找不到主机的IPv4地址
  7. Nik Collection 4 for Mac可独立使用的ps滤镜工具
  8. 关于MVVM的面试问题
  9. Cecil学C#界面编程——配置环境和入门
  10. 某电商客户数据价值分析项目
  11. 合工大机器人足球仿真考试题56题(底层uva)
  12. 达观数据智能财务审核机器人,助力央企财务共享中心智能转型
  13. Test on 12/01/2018
  14. EOSRAM终扩容,再谈如何在币圈做“价值投资”!
  15. HTCviveVR基于unity开发搭建初始界面
  16. SpringCloud DataFlow — 0. 本地部署
  17. 因缺思厅的程序员故事
  18. GBase 数据同步工具RTSync
  19. 【PS素材】手绘浪漫水彩花卉英文字母设计素材
  20. JAVA之IO流、异常、File文件类

热门文章

  1. 基于ARM开发板搭建物联网服务器
  2. 应届毕业生社会踏入社会需要注意的几点社会经验总结
  3. 基于matlab的JPEG彩色图像编码解码源码
  4. matlab里mapminmax,Matlab的mapminmax函数说明[转]
  5. 比较好用的时间计算器有哪些?时间差计算器
  6. Linux环境下安装Xilinx ISE 14.6
  7. 乌云内部网站漏洞扫描工具Extensible Web Attack Framework
  8. SpringBoot整合ELK日志收集
  9. 用Photoshop给照片换美丽天空
  10. 在IDE中使用Bito - 一个不需要VPN就可以使用的chatgpt