zz: 如何使用try,catch, throw
2009-06-05 14:48
561 查看
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种方式
一种是返回一个错误值
另外一种就是抛出异常
在我自己的设计中,什么时候返回值什么时候抛出异常,很值得推敲一下
经验分享,如何使用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种方式
一种是返回一个错误值
另外一种就是抛出异常
在我自己的设计中,什么时候返回值什么时候抛出异常,很值得推敲一下
相关文章推荐
- Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
- 经验分享,如何使用try,catch, throw之二
- 如何使用try catch throw
- Java - Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
- 经验分享,如何使用try,catch, throw之一
- 如何使用 TRY/CATCH 语句避免死锁
- JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗
- JavaScript_try...catch语句与throw结合使用示例
- 【恶搞】如何在Unity正确的使用try-catch
- JavaScript------Throw和Try-Catch的使用
- 黑马程序员——throws和throw的区别,try、catch和finally的使用场景
- try...catch...finally;throw与throws关键字联合使用
- JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
- C++中的异常捕获与处理:Try、Throw、Catch关键字的理解和使用
- 最新关于try ,catch,throw的使用小结
- JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
- Foreach语句,Throw语句,Try,catch语句的使用,报告编译错误
- JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
- C#如何使用 Try/Catch 块捕捉异常
- 编译器内部的秘密--微软的编译器是如何解析Try/Catch/Throw的