EffectiveExceptionHandlinginVisualC++译..docxVIP

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
EffectiveExceptionHandlinginVisualC译.

Effective Exception Handling in Visual C++在C++中进行有效的异常处理出自CodeProject,原文链接:/Articles/207464/Exception-Handling-in-Visual-Cplusplus译:Sleepysleepysoft@2012年11月4日星期日介绍这篇文章描述的是捕获和处理运行在Windows下的Visual C++程序中异常与错误的标准技术。异常(或者说关键性错误、崩溃)一般来说是你的程序运行不正常,从面不得不停止运行的情况。比如说,如果你的程序访问一块无效的内存地址(如NULL指针)、无法分配一个Buffer(内存不足)、C语言库的运行时(C run-time libraries,CRT)发现一个错误,并且需要程序立即停止运行等等,这些情况下都会产生一个异常。一个C++程序可能会处理几种异常:SEH异常,这是由操作系统结构化异常处理系统产生的;CRT错误,这是由C语言库运行时——还有——信号(signals)产生的。每种类型的错误都需要安装一个异常处理函数,以便能在出错时拦截这个消息,并做一些错误恢复的处理。如果你的程序有好几个线程,那么事情或许会更复杂一些。有些异常处理机制是对整个程序有效的,而另一些则仅对当前线程有效,这种情况下,你必须为每个线程都安装异常处理。你程序中的每个模块(EXE或DLL)如果都连接了CRT库(无论是静态还是动态的),那么异常处理的方法就主要基于CRT的连接方式(?)。各种各样类型的错误,多线程下对异常的各种不同的捕获方法,还有基于CRT连接方式异常处理,这让你的程序捕获所有可能的异常变得困难且麻烦。这篇文章的目的就在于帮助你更好的了解异常机制,并在你的C++程序中更好更有效的利用它。这篇文章附带了一个小控制台程序ExceptionHandler作为例子,这一个例子能产生和捕获各种不同的异常,并且能生成一个崩溃时的Dump文件,通过这个文件你可以定位到出错的代码行。背景知识之前有一段时间,我想找到一种可以拦截程序异常的方法,好用在我的一个开源工程上,CrashRpt - A crash reporting library for Windows applications.CrashRpt库会捕获程序中出现的异常,并收集相关的错误信息(比如崩溃时的Dump文件、错误Log、出错时的屏幕截图等),并且还可以将这些错误报告发送到网络上(图1)。图1 - CrashRpt库的错误报告窗口及错误详细信息窗口你可能曾经遇到过Windows的错误报告窗口(图2)突然在屏幕上弹出的情况,CrashRpt库其实做的是同样的事情,只不过它会将错误报告发送到你的web服务器上,而不是像Winodws自身错误报告一样,会将错误报告发送到微软的服务器上。图2 – Windows错误报告(传说中的华生医生)窗口浏览了一下MSDN,上面说的SetUnhandledExceptionFilter()这个函数我用来捕获非法访问的异常。不过不久后我就发现程序中的一些错误还是捕获不到,我的CrashRpt窗口没有弹出,华生医生还是会出现。我继续在MDSN搜寻,发现CRT中提供了不少的函数可以用来处理CRT的异常。比如说这几个函数set_terminate(),_set_invalid_parameter_handler(),_set_purecall_handler()。然后我还发现有些CRT的异常处理函数仅对当前线程有效,而有些却对整个进程都有效。继续研究后,我发现开发人员想要有效的使用异常处理机制,必须了解许多细节方面的问题。关于异常的只言片语正如你已经知道的,一个异常或严重错误表明了程序已经无法正常执行,需要立即停止运行。比如,下面这些情况都会导致异常:程序访问了一块非法的内存地址(比如NULL指针)在无限递归中,栈溢出大块数据被写入一片小缓冲区C++类中的纯虚函数被调用内存无法分配(内存不足)向C++的系统函数中传入非法的参数C运行库遇到错误,需要停止程序运行有两种类型的异常:SEH异常(结构化异常处理)和标准C++异常。关于它们的原理与实现,你可以去看看Vishal Kochhar写的一篇优秀的文章,在里面有深入的描述:How a Compiler Implements Exception Handling。结构化异常处理系统是由操作系统提供的(这意味着所有的Windows程序都能产生和处理SEH异常)。SEH异常最初是为C语言设计的,但在C++中也可以使用。SEH异常是通过__try{}__except(){}这样的结构来处理的。程序中的main()函数就被这样的结构包围着,所以所有没有被处理的SEH异常默认都会被捕获,华生医生会弹出来。SE

文档评论(0)

xznh + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档