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