当前所在位置:珠峰网资料 >> 计算机 >> 软件水平 >> 正文
2015年软件设计师复习:异常的使用心得
发布时间:2012/9/16 23:18:48 来源:城市网学院 编辑:admin
   工欲善其事,必先利其器。在做一个项目时必定要先做好调试除错的预备在面向过程编程的时代都是以检测返回的错误代码来判定错误,可是这种方法的缺点是假如编写某一操作的时候可能出现的错误代码(比如说硬件操作)太多,那么最终用户将会陷入倒无穷无尽的检测代码中,可能会是这个样子
    UINT err=Functionxx(…);
    if(err==xxx)
    …
    if(err==xxx)
    …
    …
    …
    省略100行
    只有这样程序才能在出现意外的时候有所相应和恢复,但是由于错误处理太庞大了最终用户很可能这样
    if(Functionxx()!=SUCEEDED)
    exit(0);
    这样某些可能可以恢复的操作也无法幸免了,(比如说网络连接超时,终止运行太过分了吧,只要弹出个对话框就行了)
    在面向对象编程的时候,不可否认,很多人仍然还是这样排错的,其实各种面向对象的语言都提供了异常处理的手段(比如说Object Pascal,C++,本文以C++为例)
    下面是我的关于异常的一些使专心得
    对于各种用户来说,并不是每一种错误都是他关心的,非凡是小组开发的时候比如某一模块是关于文件操作的,那么编写这个模块的程序员只要注重关于文件操作失败的异常就行了,而网络模块的程序员只要知道网络出错的错误处理就行了,因此,我们可以定义一个这样的类
    class CBasicException
    {
    CBasicException(…);
    char* GetDescription();
    UINT GetErrorCode();
    …
    };
    然后再从这个类继续几个子类
    CFileException,CNetException…
    然后和具体某一类错误相关的具体的异常分别从上面的类里面继续,比如文件打开失败,空间不够等等[NextPage]    可以从CFileException继续,而连接超时等等可以从CNetException继续,如此一来就将错误分类了整个类层次是这样的
    CBasicException
    / \
    CFileException CNetException
    / \ / \
    COpenFailed … CTimeOut … 进入讨论组讨论。
    之后将各个错误码和相应的异常对应起来,一些不太重要的信息可以封装在一个异常里,比如文件打不开可能是空间不够或共享冲突…,都可以放在一起,假如以后要专门处理某一样,比如空间不够,再从相应的基类继续即可(COpenFialed)
    然后你的函数应该这样实现
    CMyfunc()
    {
    …
    throw Cxxx(…);
    }
    而在相应的调用部分则可以这样写
    void Operation1()
    {
    try{
    Myfunc()
    }
    catch(CFileException& e)//处理文件
    {
    PRintf(“%s”,e.GetDescription());
    throw;//重新抛出,假如搞定就不用再抛出了
    }
    catch(CNetException& e)//网络
    {
    …
    throw;
    }
    }
    这样只要catch想要处理的异常就行了 [NextPage]    但是你的主函数应该这样写
    void main()
    {
    try{
    Opertion1();
    Operation2();
    Operation……
    …
    }
    catch(Cxxx& e)//处理未捕捉的重要异常
    {
    …
    }
    catch(CBasicException& e)//对你所封装的错误总的处理
    {
    …
    }
    catch(…)//其他异常,未被封装,比如除0
    {
    …
    }
    }
    这样处理就合理多了
    而且假如在异常的描述里加上出错地点就更好了,比如出错函数名
    不过千万不要将异常基类的catch写在子类的上面否则子类的catch可能永远不会工作了
    比如:
    try{
    …
    }
    catch(CBasicException& e)
    {
    …
    }
    catch(CFileException(& e)
    {
    …
    }
    这样后面的catch就再也不会被执行了
    另外在类的构造函数和析构函数里不能返回值的,这时就只能用异常了
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved