细说windows的异常处理和实现——结构化异常

异常与C++的异常

C++编程中有一个重要的机制就是异常的处理,标准的C++定义了try...catch..throw的异常处理机制。但是这只是C++里的异常。

 

广义的异常可以分为硬件产生的异常软件产生的异常,像throw这样的动作就是在软件上产生一个异常,但是像写入一个非法内存、除0这些都是硬件产生的异常;

异常的处理可以分为结构化异常处理(Structured Exception Handling)SEH和向量异常处理(Vectored exception handling)VEH

 

C++里try...catch..throw属于SEH,但是他只能捕捉显示的throw出来的软件异常,明确这个问题非常重要。以前一直认为可以catch任何异常,其实这种想法是错的,比如写一句int* p=0;*p=1;这样的语句是catch不到的,直接就会crash了,因为这是内存错误,硬件异常。

 

这样看来,C++的try...catch..throw异常处理机制只是处理了所有异常中的一个子集而已。

然而在windows上开发的我们,尤其是去开发一些产品,我们希望有方法去处理任何异常,绝不让用户突然收到一个崩溃的感叹号,提高用户的体验怎么办?

原来window在系统层面上提供了更多的异常的处理机制,而C++的try...catch..throw也只是window系统的异常处理机制中被整合进去的一小块。

 

window系统层面的(结构化)异常处理机制

window是把所有的硬件和软件的异常都整合起来同等看待,无论是内存错误、用throw产生一个异常,都会触发操作系统对当前的线程的异常处理

每个线程在创建后,都会初始化一个数据结构:

 ;struct _EXCEPTION_REGISTRATION{
 ;     struct _EXCEPTION_REGISTRATION *prev;
 ;     void (*handler)(PEXCEPTION_RECORD,
 ;                     PEXCEPTION_REGISTRATION,
 ;                     PCONTEXT,
 ;                     PEXCEPTION_RECORD);
 ;     struct scopetable_entry *scopetable;
 ;     int trylevel;
 ;     int _ebp;
 ;     PEXCEPTION_POINTERS xpointers;
 ;}

 

很多个EXCEPTION_REGISTATION 连成一个list L

其中的每个节点包含了一个handler成员,他就是具体的对异常进行处理的操作(可以猜测catch后的内容就是最终被整合到这个函数里的)

当一个异常E发生后,系统会寻找这个线程的L,从头开始,知道寻找到能对E进行处理的那个节点EXCEPTION_REGISTATION,对其进行处理。

对于C++的try catch其实就是在try的时候将L里面建立一个新的节点,用于捕捉某个异常。

 

所以win的异常处理机制的核心就在于每个线程内的这个EXCEPTION_REGISTATION 的list。

 

这里有个问题,就是当一个异常没有再list寻找到相应的节点怎么办,其实这个list会在尾端放置一个默认的异常处理单元,当查询到尾端时就一定调用这个处理函数。

所以我们就有一种办法去截获所有程序中我们无法catch的异常(硬件或软件),就是去自定义这个处理函数,使用API  SetUnhandledExceptionFilter

 

万能的异常捕获器 SetUnhandledExceptionFilter

记住这个函数只有在release版本生效!

win程序在release情况下,发生了异常,并且没有被捕捉处理,就会调用一个默认的UnhandledExceptionFilter函数,这个函数还传入一个参数_EXCEPTION_POINTERS*,里面有crash的一些信息。


如果我们想自定义这个处理方法,就可以自定一个函数如

 long __stdcall MyUnhandledExceptionFilter (_EXCEPTION_POINTERS* ExceptionInfo){。。。

}

然后使用SetUnhandledExceptionFilter set进来。

MyUnhandledExceptionFilter 函数有三种返回值:

EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以结束了,这时执行完这个函数程序退出
EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
EXCEPTION_CONTINUE_EXECUTION equ -1 表示错误已经被修复,请从异常发生处继续执行  ,这时程序会试图在运行一遍刚才又问题的代码

 

通过自定义的异常处理函数,等于截获了程序出错的最后一道屏障,在程序crash即将关闭前改变了原有的行为,可以做到:

1.可以dump出来当前的信息,上传给服务器用于技术人员统计分析

2.可以用更加友善的界面告诉你的用户程序出错了,优雅的挂掉

 

时间: 2024-08-06 02:44:32

细说windows的异常处理和实现——结构化异常的相关文章

Win32结构化异常处理(SEH)探秘(上)

在 Win32 操作系统提供的所有功能中,使用最广泛但最缺乏文档描述的也许就是结构化异常处理了(SEH),当你考虑 Win32 结构化异常处理时,你也许会想到诸如 _try,_finally 以及 _except 这些术语.你能在任何有关 Win32 的书中发现对 SEH 很好的描述(即使是 remedial).即便是 Win32 SDK 也具备有相当完整的使用 _try,_finally 和 _except 进行结构化异常处理的概述. 有了这些文档,那为何还说 SEH 缺乏文档呢?其实,Win

link中结构化异常处理方面的问题?如果我希望忽略异常请问怎么做?

问题描述 link中结构化异常处理方面的问题?如果我希望忽略异常请问怎么做? link中结构化异常处理方面的问题?如果我希望忽略异常请问怎么做? 解决方案 在lambda表达式内处理异常,不要丢出异常

通过SQL 2008管理非结构化数据

通过SQL Server 2008管理非结构化数据 SQL Server 技术文档 作者:Graeme Malcolm (内容主管) 技术审核员:Shan Sinha 项目编辑:Joanne Hodgins 发布日期:2007年8月 适用产品:SQL Server 2008 概述:数字化信息的增长为企业应当存储和访问业务数据的方法提供了启发.数据库作为业务应用程序的核心,必须能够同非结构化的数据进行集成,其中包括文档.图像.视频.以及其它多媒体格式.为了能够对信息生命周期进行管理,满足策略需求,

12个思维导图工具,像数据科学家一样结构化地思考

◆ ◆ ◆ 引言 每个人都能进行全方位的思考,但是,用结构化的方式思考与酝酿使得数据科学家与众不同.在本文中,我们列出了一些对数据科学家来说是很棒的思维导图工具.这些工具提供了用创造性方式产生想法的很好的方法. 让我们从一个数据科学家经常面对的简单小练习开始: 你已经被指定为我们表现最差的店铺的店长,你会在店里做哪些可能的改变? 花几分钟时间仔细想一想.一旦你写下至少几个因素,我们就可以继续下去了. 那么,这个小练习怎么样?容易还是困难?你有多确定你在这个思维捕捉的过程中写下了所有可能的因素?

HTML结构化:DIV+CSS网页布局入门指南

css|网页  你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习: 第一种可能是你还没有理解CSS处理页面的原理.在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义.结构添加CSS.这篇文章将告诉你应该怎样把HTML结构化. 另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,.hspace.align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句. 当你解决了第一种问题,知道了如何结

HTML结构化:实践DIV+CSS网页布局入门指南

css|网页 你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习: 第一种可能是你还没有理解CSS处理页面的原理.在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义.结构添加CSS.这篇文章将告诉你应该怎样把HTML结构化. 另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,.hspace.align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句. 当你解决了第一种问题,知道了如何结构

XHTML结构化:使用XHTML按标准重构网站

xhtml|标准 我们曾经为本节撰写的标题是:"XHTML:简单的规则,容易的方针."原因之一是,本节讨论的规则和方针是简单和容易的.原因之二是,一本简单和容易的WEB设计图书,就像超级市场的新式的免费商品一样,虽然常见却可以有效地吸引人的眼球,这样的东西可以刺激人的兴趣,并且鼓励人们尝试. 我确实希望本节的内容可以激发你的兴趣,并鼓励你去尝试.为什么这么说呢?因为一旦你掌握了本章包含的简单容易的理念,你就会重新思考网页运作的方式,并开始改变建造它们的方法.然而我并不希望你只是将代码重

结构化的XHTML和CSS页面转换成为打印机页面

css|xhtml|打印|页面|转换 在以前,为Web页面创建一个打印机友好的版本意味着要设计一个布局和格式都经过修改的单独页面,这样才能够在打印的时候获得令人满意的效果.现在,通过使用结构化的XHTML和CSS,你可以实现同样的效果而只用花费少得多的精力.  从屏幕显示到打印效果 大多数的Web页面都是设计适用于在计算机屏幕上观看的.然而,有的时候用户需要将某些页面打印出来,也许就是为了保留一个长期的记录,或者将其用作方便的离线参考资料. 现在的麻烦是,让Web页面在计算机彩色屏幕上看起来引人

结构化HTML DIV CSS网页布局入门指南

css|网页 你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习: 第一种可能是你还没有理解CSS处理页面的原理.在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义.结构添加CSS.这篇文章将告诉你应该怎样把HTML结构化. 另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,.hspace.align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句.  当你解决了第一种问题,知道了如何结