三种错误处理的方法

来源:互联网 发布:钢铁出口数据 编辑:程序博客网 时间:2024/05/24 01:23

日常有道毒鸡汤:All our dreams can true if we have the courage to pursue then.
如果我们有勇气去追求,我们所有的梦想都可以成为现实。
我觉得这碗鸡汤很好喝,哈哈,路虽远,行则将至。
=======================================================
今天看《剑指offer》(88页底)的时候,看到了三种错误处理的方式,有一点点困惑,大概的总结一下。
一:采用返回值的方法

参考以下代码:[下面代码出处,以下还有两段](http://blog.csdn.net/dylgsy/article/details/946056%20%E4%BB%A3%E7%A0%81%E5%87%BA%E5%A4%84

int nRet = DoThing1();if(nRet != SUCCESS){     cout << "DoThing1 failed with error" << endl;     if((nRet == -1cout << "DoThing1 failed with error -1" << endl;     if(nRet == -2)          cout << "DoThing1 failed with error -2" << endl;     goto err; // 负责清除资源}err:     FreeSomeResource();

二:采用全局变量的方法,使用一个函数获取错误信息
这里写图片描述
参考以下代码:

if(DoThing1() == ERROR){     cout << "DoThing1 failed with error" << GetLastError() << endl;     return false;}if(DoThing2() == ERROR){     cout << "DoThing2 failed with error" << GetLastError() << endl;     return false;}

全局变量的意思应该是定义一个false,发生错误时只占用了这一个返回值,而GetLastError()函数会给出我们想要的错误信息,不需要象第一种方法一样。

三:异常
这里写图片描述
参考以下代码:
try
{
DoThing1();
DoThing2();
DoThing3();
}
catch(Exeception &e)
{
cout << “Error occur!” << e.Msg() << endl;
}
这样做的话,代码就清爽多了,而且如果我们在某层没截取到异常的时候,异常不会丢,它会继续往外层传,所以就不会有漏网之鱼。
使用异常之后,我们所有的函数都可以以这种的方式去写了。如下:
// DoThing1() 可能调用了其他人的接口
DoThing1()
{
try
{
…;
}
catch(…)
{
…;
}
}
// DoThing2() 可能调用了其他人的接口
DoThing2()
{
try
{
…;
}
catch(…)
{
…;
}
}
// main() 调用了我们的接口
void main()
{
try
{
DoThing1();
DoThing2();
}
catch(…)
{
…;
}
}
在try块中我们不用去管错误,只管逻辑,而在catch块中,我们才进行错误的处理。
这就有点像JAVA的代码了,但是我们C++ 程序员没办法象JAVA程序员一样完全使用异常处理,这是有历史原因的,因为异常处理关系到整套异常类的定义。JAVA已经定义了一个完整的类库,所有的错误处理都用异常来表示。但是我们C++程序员还是有很多的函数库是使用返回值的方法来做的。所以为了兼容C,我们没办法做到完全使用异常处理。

使用异常解决了使用返回错误代码方法存在的问题,当然,使用异常也不是没有代价的。异常会增加程序的负担,因此滥用异常也是不可取的。写若干try…catch和写数以千计的try…catch之间是有很大区别的。

四:总结三种方法的优缺点
这里写图片描述

原创粉丝点击