Обработка условий в пользовательских удалителях интеллектуальных указателей - PullRequest
0 голосов
/ 10 июня 2019

У меня есть уникальный указатель с пользовательским средством удаления, предоставляемым в качестве лямбда-функции.В лямбда-функции мне нужно обработать 2 сценария.Если возникает исключение, делай одно, а если нет, делай другое.Каков наилучший способ узнать, что произошло исключение внутри лямбда-функции?

    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 Ответ

1 голос
/ 10 июня 2019

Предполагая, что 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
    }
}
...