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