智能指针自定义删除器中的处理条件

时间:2019-06-10 07:08:47

标签: c++ smart-pointers

我有一个唯一的指针,带有作为lambda函数提供的自定义删除器。在lambda函数中,我需要处理2种情况。如果发生异常,则做一件事,如果不发生,则做另一件事。知道lambda函数内部发生异常的最佳方法是什么?

    void f()
    {
        //start a transaction
        std::unique_ptr<Transaction> transactionOb(new Transaction(),[](Transaction* transaction)
        {
          if(exception occurred)
                {
                  transaction->rollback()
                }
                else
                {
                  transaction->commit()
                }
        });

        try
        {
           //write data to database
        }
        catch()
        {
          //handle exception
        }
    }

1 个答案:

答案 0 :(得分:1)

假设transactionOb并未将其Transaction传递到其他地方,则可以引用捕获某些本地状态,并将其设置为catch中的其他值

void f()
{
    bool didExcept = false;
    //start a transaction
    std::unique_ptr<Transaction> transactionOb(new Transaction(),[&didExcept](Transaction* transaction)
    {
        if(didExcept)
        {
            transaction->rollback()
        }
        else
        {
            transaction->commit()
        }
        // Missing delete transaction
    });

    try
    {
       //write data to database
    }
    catch()
    {
        didExcept = true;
      //handle exception
    }
}

或者,您也可以回滚catch,然后取消设置指针。

void f()
{
    //start a transaction
    std::unique_ptr<Transaction> transactionOb(new Transaction(),[](Transaction* transaction)
    {
        if(transaction)
        {
            transaction->commit()
        }
        delete transaction;
    });

    try
    {
       //write data to database
    }
    catch()
    {
        transactionOb->rollback();
        delete transactionOb.release();
      //handle exception
    }
}