您的位置:首页 > 其它

zz: 如何使用try,catch, throw

2009-06-05 14:48 519 查看
zz: http://topic.csdn.net/u/20090404/00/16f638ac-4a6a-4e22-ad7b-58fd06efb35f.html?29315

 

经验分享,如何使用try,catch, throw之一

try,catch, throw的含义就很清楚,但怎么使用,我还是过了好多年才明白一些

先看一个不好的例子

C/C++ code

//----------------- 不好的代码 -----------------
class CTest1;
class CTest2;
class CTest3;

void BadCode()
{
//new test1
CTest1 * pTest1 = new CTest1;

//do something
bool bRet = DoSomething();
if (!bRet)
{
delete pTest1;
return;
}

//new CTest2
CTest2 * pTest2 = new CTest2;

//do something
bRet = DoSomething();
if (!bRet)
{
delete pTest1;
delete pTest2;
return;
}

//new CTest3
CTest3 * pTest3 = new CTest3;

//do something
bRet = DoSomething();
if (!bRet)
{
delete pTest1;
delete pTest2;
delete pTest3;
return;
}

//release
delete pTest1;
delete pTest2;
delete pTest3;
}

下面是我个人比较喜欢的写法

C/C++ code

//--------- 好的例子 ---------------
class CTest1;
class CTest2;
class CTest3;

void MyCode()
{
//define
CTest1 * pTest1 = NULL;
CTest2 * pTest2 = NULL;
CTest3 * pTest3 = NULL;

//使用try, catch, throw
try
{
//new test1
pTest1 = new CTest1;

//do something
bool bRet = DoSomething();
if (!bRet)
throw -1;

//new CTest2
pTest2 = new CTest2;

//do something
bRet = DoSomething();
if (!bRet)
throw -2;

//new CTest3
pTest3 = new CTest3;

bRet = DoSomething();
//do something
if (!bRet)
throw -3;

//release
delete pTest1;
pTest1 = NULL;
delete pTest2;
pTest2 = NULL;
delete pTest3;
pTest3 = NULL;
}
catch(...)
{
if (pTest1)
delete pTest1;
if (pTest2)
delete pTest2;
if (pTest3)
delete pTest3;
}
}

另外在一个函数里不仅仅只有一个try,catch。可以有多个。比如:
//--------- 多个try的例子 ---------------
class CTest1;
class CTest2;
class CTest3;

void MyCode()
{
//define
CTest1 * pTest1 = NULL;
CTest2 * pTest2 = NULL;
CTest3 * pTest3 = NULL;

//使用try, catch, throw
try
{
//new test1
pTest1 = new CTest1;

//do something
bool bRet = DoSomething();
if (!bRet)
throw -1;
}
catch(...)
{
;
}
if (pTest1)
delete pTest1;

try
{
//new CTest2
pTest2 = new CTest2;

//do something
bRet = DoSomething();
if (!bRet)
throw -2;
}
catch(...)
{
;
}
if (pTest2)
delete pTest2;

try
{
//new CTest3
pTest3 = new CTest3;

bRet = DoSomething();
//do something
if (!bRet)
throw -3;

}
catch(...)
{
;
}
if (pTest3)
delete pTest3;
}

简单说一下
第一种写法,需要在不同的地方delete 不同的变量
第二种写法,在catch里delete所有的变量,代码的结构看起来更容易读,也易于维护

//define
  CTest1 * pTest1 = NULL;
  CTest2 * pTest2 = NULL;
  CTest3 * pTest3 = NULL;
变量定义一定要在try之前定义,否则catch里找不到这些变量的定义

另外很重要的一点,在delete之后必须将变量设成NULL

catch里的delete可以删掉
把try里的delete放catch后,因为指针都初始化NULL了

 

经验分享,如何使用try,catch, throw之二

什么时候使用try,catch,什么时候不用;什么时候用throw,什么时候不用。工作了很多年才明白。

我个人的理解是:
1。在private或者protected的成员函数不使用try,catch,而只使用throw
2。如果在private或者protected的成员函数需要使用try,catch,那么就要使用rethrow
3。在public成员函数里使用try,catch
4。如果该类相对于整个项目来说是属于被调用层,那么public成员函数也可以不使用try,catch
5。如果调用第三方的代码,我一般都会用try,catch

我个人的习惯是把private或者protected成员函数的名字使用前缀__,public函数不用

先看一个我不喜欢的写法

C/C++ code

//------------- try, catch, throw 例子,不喜欢的写法 ------------
class CTest
{
public:
int Init();
private:
int __InitA();
int __InitB();
int __InitC();
}

//--------- Init ------------
int CTest:Init()
{
try
{
int err;
err = __InitA();
if (err != 1)
throw -1;

err = __InitB();
if (err != 1)
throw -2;

err = __InitC();
if (err != 1)
throw 3;

return 1;
}
catch(int & err)
{
return err;
}
}

//---------- __InitA ----------
int CTest::__InitA()
{
try
{
int err;
err = DoSomething1();
if (err != 1)
throw -1;

err = DoSomething2();
if (err != 1)
throw -2;

return 1;
}
catch(int & err)
{
return err;
}
}

__InitB, ___InitC和___InitA类似

下面是我个人比较喜欢的写法

C/C++ code

//------------- try, catch, throw 例子,喜欢的写法 ------------
class CTest
{
public:
int Init();
private:
int __InitA();
int __InitB();
int __InitC();
}

//--------- Init ------------
int CTest:Init()
{
try
{
__InitA();
__InitB();
__InitC();

return 1;
}
catch(int & err)
{
return err;
}
}

//---------- __InitA ----------
int CTest::__InitA()
{
int err;
err = DoSomething1();
if (err != 1)
throw -1;

err = DoSomething2();
if (err != 1)
throw -2;

return 1;
}

__InitB, ___InitC和___InitA类似

我喜欢的写法是private或者protected函数没有try,catch,只有throw
在public函数就不需要去判断每个private或者protected函数的返回值了
看起来会更清楚一点

如果在private或者protected的成员函数需要使用try,catch,那么就要再throw,而不是调用return

回想一下windows的win32函数,返回有2种方式
一种是返回一个错误值
另外一种就是抛出异常
在我自己的设计中,什么时候返回值什么时候抛出异常,很值得推敲一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐