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

Handling conditions within smart pointer custom deleters

本文关键字:处理 条件 指针 自定义 删除 智能      更新时间:2023-10-16

我有一个唯一的指针,其中包含作为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
        }
    }

假设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
    }
}