zz: 如何使用try,catch, throw

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种方式
一种是返回一个错误值
另外一种就是抛出异常
在我自己的设计中,什么时候返回值什么时候抛出异常,很值得推敲一下

你可能感兴趣的:(工作,windows,null,delete,Class)