c异常和windows结构异常的比较

c异常和windows结构异常的比较

ID:34722493

大小:261.03 KB

页数:20页

时间:2019-03-10

c异常和windows结构异常的比较_第1页
c异常和windows结构异常的比较_第2页
c异常和windows结构异常的比较_第3页
c异常和windows结构异常的比较_第4页
c异常和windows结构异常的比较_第5页
资源描述:

《c异常和windows结构异常的比较》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、查看文章 try...catch与__try...__except2009-09-2411:43VC中的这两个东西肯定谁都用过,不过它们之间有什么区别,正好有时间研究了一下,如果有错误欢迎拍砖.基于VC2005,32位XP平台测试通过.估计对于其他版本的VC和操作系统是不通用的.1.try...catch这个是C++语言定义的,每个C++都有对其的不同的实现.使用也很简单.比如我们有一个函数,读入年龄.如果<=0或者>=100,抛出异常:intreadAge(){  intage=读入年龄;  if(age<=0

2、

3、age>=100){     throwAgeException(age)

4、;  }  returnage;}其中AgeException的定义为classAgeException{  public:  interrorAge;  AgeException(intage){     errorAge=age;  }};在使用的时候也比较简单,try{  inti=readAge();  printf("Ageinputedis%d",i);}catch(AgeExceptione){  printf("error.Ageinputed=%dandisnotvalid.",e.errorAge);}2.__try...__except这个是VC自己定义的不是C++的

5、关键字.VC在编译__try...__except的时候,会按照WindowsSEH(结构化异常)处理的规则,把异常处理部分加入到当前线程的异常处理链中.这部分不详细写了,SEH处理在网上的文章一搜一大把.3.try...catch与__try...__except使用上的区别对于上面的AgeException,我们也可以使用__try...__except来处理:__try{  inti=readAge();  printf("Ageinputedis%d",i);}__except(EXCEPTION_EXECUTE_HANDLER){  printf("Ageisnotcorrect

6、.");}但是,对于__try...__except能够处理的异常(比如下面的代码),C++异常处理try..catch不能够捕获(Catch段不能执行):try{  int*p=NULL;  *p=0;}catch(...){  printf("Exceptionoccured.");}注:这里其实和编译器有关,VC2005由/EH加上参数来控制,详情参见http://msdn.microsoft.com/en-us/library/1deeycx5(VS.80).aspx.这里讨论的是默认的情况,不处理的时候.这是为什么呢.仔细看了下,当我们在程序里面throw出来一个异常的时候,调试

7、器(比如VC,WinDBG)会记录下面一个事件:First-chanceexceptionat0x7c812afb(kernel32.dll)intrycatch.exe:MicrosoftC++exception:AgeExceptionatmemorylocation0x0012fc98..也就是说,在VC中,throw出来的都是MicrosoftC++exception.只有这种Exception才能被try...catch捕获.同样,用WinDBG装载上面的程序__try{  inti=readAge();  printf("Ageinputedis%d",i);}__except

8、(EXCEPTION_EXECUTE_HANDLER){  printf("Ageisnotcorrect.");}会发现,出现的异常为C++exception,异常代码为0xe06d7363:也就是说,在C++中throw出来的异常是一种特殊的类型的异常,是微软专门为VC++实现的,异常代码为0xe06d7363.(有意思的是ASCII码为0x6d,0x73,0x63的字符为msc)到这里我们基本可以得出一个结论,try...catch和__try...__except其实从本质上来说是一回事,他们从根源上来说都是用到了Windows的SEH处理机制.不同点在于:-)try...catc

9、h只处理异常代码为0xe06d7363的C++exception,不会理会其他的;-)try...catch对于编译器来说做了一些额外的工作,但是最终的实现是和__try...__except都要归结于SEH-)try...catch多了一些额外的传递具体的异常信息的部分(catch的是何种异常.不像是__try...__except,需要用ExceptionCode去判断)想到这,想到了下面一个问题,就是VC++编译器

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。