如何使用try catch throw

来源:互联网 发布:如何使用ps软件 编辑:程序博客网 时间:2024/06/05 02:31

--------------------------------------------------------

以前使用的不多,转个帖子,从现在开始有所改变吧!

--------------------------------------------------------

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

先看一个不好的例子 
//----------------- 不好的代码 ----------------- 
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; 

 

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

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

void BadCode() 

  //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,什么时候不用;什么时候用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函数不用 

先看一个我不喜欢的写法 
//------------- 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类似

 

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

//------------- 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类似

原创粉丝点击