Windows平台异常处理 开发中何时利用异常处理模块

来源:互联网 发布:linux如何安装win7 编辑:程序博客网 时间:2024/06/01 20:13

1.异常概念

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

2.C++异常概念

标准的C++定义了try…catch..throw的异常处理机制(C++异常,在MFC3.0或者以后的版本才可用)

3.MFC异常概念

通过TRY, CATCH, AND_CATCH, END_CATCH, THROW,THROW_LAST异常宏实现的异常处理机制(MFC异常宏,在MFC1.0或者以后的版本可用)
MFC异常宏和C++异常区别
1. 当异常被捕获后,MFC异常宏会自动的delete掉捕获的异常, C++异常需要你手动的delete掉捕获的异常
2. C++异常关键字非常通用,它能处理任何异常类型(int,float,char 等等),而MFC异常宏仅能处理CException类和继承于CException的类
MFC异常宏

TRY  {      //Execute some code that might throw an exception.      AfxThrowUserException();  }  CATCH( CException, e)  {      // Handle the exception here.      if (m_bThrowExceptionAgain)          THROW_LAST();      //没必要删除e.  }  END_CATCH

C++异常

try    {        // Execute some code that might throw an exception.        AfxThrowUserException();    }    catch( CException* e )    {        // Handle the exception here.        // "e" contains information about the exception.        if (m_bThrowExceptionAgain)            throw; // Do not delete e        else             e->Delete();//删除e,否侧引起内存泄露    }

4.异常处理概念

异常的处理可以分为结构化异常处理(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异常处理机制只是处理了所有异常中的一个子集而已
另外,向量异常处理有一个特别有意思的地方,他能截获所有信息,并且优先于其他异常捕捉.这个地方其实我自己都没有亲身实践过,不能误人子弟.请喜欢刨根问底小伙伴,自己问问度娘吧。

5.开发中何时才需要添加异常处理块

虽然理解了异常概念本身,但是在项目应用中小伙伴是否问过自己,我什么时候利用异常处理,是否是所有的程序块都需要try…catch包裹呢?
到底什么原则为好呢?我最近也问我自己,后来我总结了一下自己的经验。
1.如果你代码段落是以调用Windows API或者MFC系统函数的话,可以不用考虑异常处理块.因为Windows系统函数和API基本返回值如下类型
VOID:这个函数不可能失败!
BOOL:FALSE失败;TRUE成功。
HANDLE:失败返回NULL,否则返回非零句柄。如果有特殊说明,则可能为特殊值例如:INVALID_HANDLE_VALUE。
PVOID:返回一个内存地址,失败为NULL
LONG/DWORD:应该根据SDK说明来确定函数状况。
那么我们应该利用系统API函数GetLastError函数返回值来进行分析执行结果,所以基本不会Throw出来异常情况.
2.调用第三方系统DLL或者不开源内容时候,需要考虑参看第三方提供API手册,如果有异常可能我们需要异常情况的处理
3.调用自己开发的函数,言外之意就是代码开源部分,那么我们需要参看函数本身是否有异常机制或者业务需要进行异常处理

以上不知道对于困惑的小伙伴是否有作用,虽然我觉得不是铁的定律,但是开发中还是90%试用的。