我有一个唯一的指针,带有作为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
}
}
答案 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
}
}