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

本文通过对比两种不同风格的代码实现方式,介绍了如何利用try-catch-throw进行资源管理和异常处理,以此来提高代码的可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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;
  }
}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值