异常处理与MiniDump详解3Word下载.docx

上传人:b****3 文档编号:6807237 上传时间:2023-05-07 格式:DOCX 页数:15 大小:19.46KB
下载 相关 举报
异常处理与MiniDump详解3Word下载.docx_第1页
第1页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第2页
第2页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第3页
第3页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第4页
第4页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第5页
第5页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第6页
第6页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第7页
第7页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第8页
第8页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第9页
第9页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第10页
第10页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第11页
第11页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第12页
第12页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第13页
第13页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第14页
第14页 / 共15页
异常处理与MiniDump详解3Word下载.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

异常处理与MiniDump详解3Word下载.docx

《异常处理与MiniDump详解3Word下载.docx》由会员分享,可在线阅读,更多相关《异常处理与MiniDump详解3Word下载.docx(15页珍藏版)》请在冰点文库上搜索。

异常处理与MiniDump详解3Word下载.docx

__except( 

expression 

//exceptionhandlercode

见一个实际使用的例子:

例1:

#include 

<

iostream>

windows.h>

using 

namespace 

std;

int 

main()

__try

RaiseException(0,0,0, 

NULL);

__except(EXCEPTION_EXECUTE_HANDLER)

cout 

"

ExceptionRaised."

endl;

Continuerunning"

这可能是最简单的SEH的例子了,输出如下:

ExceptionRaised.

Continuerunning

这个例子和普通C++异常的try-catch类似,也很好理解。

只不过catch换成了except。

因为C语言没有智能指针,那么就不能缺少finally的异常语法,与JAVA,Python等语言中的也类似,(这是C++中没有的)finally语法的含义就是无论如何(不管是正常还是异常),此句总是会执行,常用于资源释放。

例2:

__finally

finallyhere."

__except

(1)

i;

getchar();

这个实例看起来过于奇怪,因为没有将各个try-finally放入独立的模块之中,但是说明了问题:

1. 

finally的语句总是会执行,无论是否异常finallyhere总是会输出。

2. 

finally仅仅是一条保证finally语句执行的块,并不是异常处理的handle语句(与except不同),所以,假如光是有finally语句块的话,实际效果就是异常会继续向上抛出。

(异常处理过程也还是继续)

3. 

finally执行后还可以用except继续处理异常,但是SEH奇怪的语法在于finally与except无法同时使用,不然会报编译错误。

如下例:

VS2005会报告

errorC3274:

__finally 

没有匹配的try

这点其实很奇怪,难道因为SEH设计过于老了?

-_-!

因为在现在的语言中finally都是允许与except(或类似的块,比如catch)同时使用的。

C#,JAVA,Python都是如此,甚至在MS为C++做的托管扩展中都是允许的。

(来自MSDN中对finallykeyword[C++]的描述)

System;

ref 

class 

MyException:

public 

System:

:

Exception{};

void 

ThrowMyException(){

throw 

gcnew 

MyException;

main(){

try 

ThrowMyException();

catch 

( 

MyException^ 

){

Console:

WriteLine( 

incatch"

);

e->

GetType());

finally 

infinally"

当你不习惯使用智能指针的时候常常会觉得这样会很好用。

关于finally异常语法和智能指针的使用可以说是各有长短,这里提供刘未鹏的一种解释,(见参考5的RAII部分,文中比较的虽然是JAVA,C#,但是实际SEH也是类似JAVA的)大家参考参考。

SEH中还提供了一个比较特别的关键字,__leave,MSDN中解释如下

Allowsforimmediateterminationofthe__tryblockwithoutcausingabnormalterminationanditsperformancepenalty.

简而言之就是类似goto语句的抛出异常方式,所谓的没有性能损失是什么意思呢?

看看下面的例子:

=0;

__leave;

=1;

i:

"

finallyhere."

输出:

0finallyhere.

实际就是类似Goto语句,没有性能损失指什么?

一般的异常抛出也是没有性能损失的。

MSDN解释如下:

The__leavekeyword

The__leavekeywordisvalidwithinatry-finallystatementblock.Theeffectof__leaveistojumptotheendofthetry-finallyblock.Theterminationhandlerisimmediatelyexecuted.Althoughagotostatementcanbeusedtoaccomplishthesameresult,agotostatementcausesstackunwinding.The__leavestatementismoreefficientbecauseitdoesnotinvolvestackunwinding.

意思就是没有stackunwinding,问题是。

如下例,实际会导致编译错误,所以实在不清楚到__leave到底干啥的,我实际中也从来没有用过此关键字。

fun()

fun();

三、 

提高篇

SEH的优点

1) 

一个很大的优点就是其对异常进程的完全控制,这一点是C++异常所没有的,因为其遵循的是所谓的终止设定。

这一点是通过except中的表达式来控制的(在前面的例子中我都是用1表示,实际也就是使用了EXCEPTION_EXECUTE_HANDLER方式。

EXCEPTION_CONTINUE_EXECUTION(–1) 

表示在异常发生的地方继续执行,表示处理过后,程序可以继续执行下去。

C++中没有此语义。

EXCEPTION_CONTINUE_SEARCH(0) 

异常没有处理,继续向上抛出。

类似C++的throw;

EXCEPTION_EXECUTE_HANDLER

(1) 

异常被处理,从异常处理这一层开始继续执行。

类似C++处理异常后不再抛出。

2) 

操作系统特性,不仅仅意味着你可以在更多场合使用SEH(甚至在汇编语言中使用),实际对异常处理的功能也更加强大,甚至是程序的严重错误也能恢复(不仅仅是一般的异常),比如,除0错误,访问非法地址(包括空指针的使用)等。

这里可以用一个例子来说明:

*p 

NULL;

catchthat"

catchthat

在C++中这样的情况会导致程序直接崩溃的,这一点好好利用,可以使得你的程序稳定性大增,以弥补C++中很多的不足。

但是,问题又来了,假如异常都被这样处理了,甚至没有声息,非常不符合发生错误时死的壮烈的错误处理原则。

很可能导致程序一堆错误,你甚至不知道为什么,这样不利于发现错误。

但是,SEH与MS提供的另外的特性MiniDump可以完美的配合在一起,使得错误得到控制,但是错误情况也能捕获到,稍微的缓解了这种难处(其实也说不上完美解决)。

这一点需要使用者自己权衡,看看到底开发进入了哪个阶段,哪个更加重要,假如是服务器程序,那么在正式跑着的时候,每崩溃一次就是实际的损失。

所以在后期可以考虑用这种方式。

关于这方面的信息,在下一次在详细讲解。

SEH的缺点

其实还是有的,因为是为操作系统设计的,实际类似为C设计,那么,根本就不知道C++中类/对象的概念,所以,实际上不能识别并且正确的与C++类/对象共存,这一点使用C++的需要特别注意,比如下例的程序根本不能通过编译。

例一:

CMyClass 

o;

例二:

错误信息都为:

warningC4509:

使用了非标准扩展:

“main”使用SEH,并且“o”有析构函数

errorC2712:

无法在要求对象展开的函数中使用__try

这点比较遗憾,但是我们还是有折衷的办法的,那就是利用函数的特性,这样可以避开SEH的不足。

比如,希望使用类的使用可以这样:

这个类利用了上节的CResourceObserver类,

CResourceObserver<

CMyClass>

};

classCMyClassConstruct.

classCMyClassDeconstruct.

可以看到正常的析构,简而言之就是将实际类/对象的使用全部放进函数中,利用函数对对象生命周期的控制,来避开SEH的不足。

四、 

参考资料

Windows核心编程(ProgrammingApplicationsforMicrosoftWindows),第4版,JeffreyRichter著,黄陇,李虎译,机械工业出版社

MSDN—VisualStudio2005 

附带版,Microsoft

加密与解密,段钢编著,电子工业出版社

4. 

Windows用户态程序高效排错,熊力著,电子工业出版社

5. 

错误处理(Error-Handling):

为何、何时、如何(rev#2),刘未鹏(pongba)著

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2