异常处理与MiniDump详解

上传人:大米 文档编号:563664151 上传时间:2023-09-16 格式:DOCX 页数:16 大小:20.11KB
返回 下载 相关 举报
异常处理与MiniDump详解_第1页
第1页 / 共16页
异常处理与MiniDump详解_第2页
第2页 / 共16页
异常处理与MiniDump详解_第3页
第3页 / 共16页
异常处理与MiniDump详解_第4页
第4页 / 共16页
异常处理与MiniDump详解_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《异常处理与MiniDump详解》由会员分享,可在线阅读,更多相关《异常处理与MiniDump详解(16页珍藏版)》请在金锄头文库上搜索。

1、(搬用工)异常处理与 MiniDump 详解(3) SEH (Structured Exception Handling) 一、 综述SEH-Structured Exception Handling,是 Windows 操 作系统使用的异常处理方式。对于SEH,有点需要说明的是,SEH是属于操作系 统的特性,不为特定语言设计,但是实际上,作为操 作系统的特性,几乎就等同与面向C语言设计,这点 很好理解,就像Win32 API,Linux下的系统调用,都是 操作系统的特性吧,实际还是为C做的。但是,作为 为C语言设计的东西,实际上可调用的方式又多了, 汇编,C+对于调用C语言的接口都是比较方便

2、的。二、基础篇还是简单介绍一下SEH的使用,但是不准备太详细 的介绍了,具体的详细介绍见参考中提及的书目。关 于SEH的基本应用Windows核心编程绝对是最佳 读物(其实个人一直认为Windows核心编程是 Windows编程领域必看的第二本书,第一本是Programming Windows。关于SEH更深入的一点 的知识可能就要参考一些能用汇编讲解的书籍了,Windows用户态程序高效排错算是其中讲的不错 的一本。首先,SEH也有像C+异常一样的语法,及类try-catch 语法,在SEH中为_try-except语法,抛出异常从throw 改为RaiseException,在MSDN中的

3、语法描述为:_t ry/ guarded code_except ( expression )/ exception handler code见一个实际使用的例子:例1:#in elude #i nclude using namespace std;in tmai n()_tryRaiseException(0, 0, 0, NULL);_except(EXCEPTION_EXECUTE_HANDLER)cout Excep tion Raised. e ndl;cout C ontinue running e ndl;这可能是最简单的SEH的例子了,输出如下:Exception Raised

4、 Continue running这个例子和普通C+异常的try-catch类似,也很好 理解。只不过catch换成了 except。因为C语言没有智能指针,那么就不能缺少fin ally 的异常语法,与JAVA,Python等语言中的也类似,(这 是C+中没有的)fin ally语法的含义就是无论如何(不 管是正常还是异常),此句总是会执行,常用于资源 释放。例2:#in elude #i nclude using namespace std;in tmai n()_try_tryRaiseException(0, 0, 0, NULL);_fin ally_except(1)trytryi

5、nt i;_fin allycout fi nally here. e ndl;_except(1)cout C ontinue running e ndl;getchar();这个实例看起来过于奇怪,因为没有将各个try-fin ally 放入独立的模块之中,但是说明了问题:1. finally的语句总是会执行,无论是否异常finally here 总是会输出。2. finally仅仅是一条保证finally语句执行的块,并不 是异常处理的handle语句(与except不同),所以,假如光是有fin ally语句块的话,实际效果就是异常 会继续向上抛出。(异常处理过程也还是继续)3. fi

6、nally执行后还可以用except继续处理异常,但是 SEH奇怪的语法在于finally与except无法同时使用, 不然会报编译错误。如下例:_tryRaiseException(0, 0, 0, NULL);_except(1)_fin allycout fi nally here. GetType();fin ally Co nsole:WriteLi ne( in fin ally);当你不习惯使用智能指针的时候常常会觉得这样会很 好用。关于finally异常语法和智能指针的使用可以说 是各有长短,这里提供刘未鹏的一种解释,(见参考 5的RAII部分,文中比较的虽然是JAVA,C#,

7、但是实际 SEH也是类似JAVA的)大家参考参考。SEH中还提供了一个比较特别的关键字,_leave,MSDN中解释如下Allows for immediate termination of the _try block without causing abnormal termination and its performance penalt y.简而言之就是类似goto语句的抛出异常方式,所谓的 没有性能损失是什么意思呢?看看下面的例子:#in elude #i nclude using namespace std;in tmai n()int i = 0;_try_leave;i =

8、1;_fin allycout i: i fin ally here. e ndl;cout C ontinue running e ndl;getchar();输出:i: 0 finally here Continue running实际就是类似Goto语句,没有性能损失指什么? 一般 的异常抛出也是没有性能损失的。MSDN解释如下:The _leave keywordThe _leave keyword is valid within a try-finally statement block The effect of _leave is to jump to the end of th

9、e try-finally block The termination handler is immediately executed Although a goto statement can be used to accomplish the same result, a goto statement causes stack unwinding The _leave statement is more efficient because it does not involve stack unwinding 意思就是没有stack unwinding,问题是。 如下例,实际会导致编译错误

10、,所以实在不清楚到 leave到底干啥的,我实际中也从来没有用过此关键 字。#in elude #i nclude using namespace std;void fun()_leave;in tmai n()_tryfun ();_fin allycout fin ally here. e ndl;runn,n-getchar();三、提高篇1. SEH 的优点1) 一个很大的优点就是其对异常进程的完全控制,这 一点是C+异常所没有的,因为其遵循的是所谓的 终止设定。这一点是通过except中的表达式来控制的(在前面的 例子中我都是用1表示,实际也就是使用了EXCEPTION_EXECUT

11、E_HANDLER 方式。 EXCEPTION_CONTINUE_EXECUTION (-)表示在异常 发生的地方继续执行,表示处理过后,程序可以继续 执行下去。C+中没有此语义。EXCEPTION_CONTINUE_SEARCH (0)异常没有处理,继 续向上抛出。类似C+的throw;EXCEPTION_EXECUTE_HANDLER (1)异常被处理,从异 常处理这一层开始继续执行。类似C+处理异常后不 再抛出。2)操作系统特性,不仅仅意味着你可以在更多场合使 用SEH (甚至在汇编语言中使用),实际对异常处 理的功能也更加强大,甚至是程序的严重错误也能 恢复(不仅仅是一般的异常),比如

12、,除0错误, 访问非法地址(包括空指针的使用)等。这里可以 用一个例子来说明:#in elude #i nclude using namespace std;in tmai n()_tryint *p = NULL;*p = 0;_except(1)cout catch that e ndl;getchar();输出:catch thatContinue running在C+中这样的情况会导致程序直接崩溃的,这一点 好好利用,可以使得你的程序稳定性大增,以弥补C+ 中很多的不足。但是,问题又来了,假如异常都被这 样处理了,甚至没有声息,非常不符合发生错误时死 的壮烈的错误处理原则。很可能导致程

13、 序一堆错误,你甚至不知道为什么,这样不利于发现 错误。但是,SEH与MS提供的另外的特性MiniDump可以完 美的配合在一起,使得错误得到控制,但是错误情况 也能捕获到,稍微的缓解了这种难处(其实也说不上 完美解决)。这一点需要使用者自己权衡,看看到底开发进入了哪 个阶段,哪个更加重要,假如是服务器程序,那么在 正式跑着的时候,每崩溃一次就是实际的损失。 所以在后期可以考虑用这种方式。关于这方面的信息,在下一次在详细讲解。2. SEH的缺点 其实还是有的,因为是为操作系统设计的,实际类似 为C设计,那么,根本就不知道C+中类/对象的概念, 所以,实际上不能识别并且正确的与C+类/对象共存, 这一点使用C+的需要特别注意,比

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号