我正在解析一个令牌队列:而不是检查每个后续pop()
队列是否为空我已经写了一个lambda抛出异常queue.begin() == queue.end()
。我想知道这是一个好的,“正确”的实现,还是一般认为从lambda表达式抛出异常是一种不好的做法?
答案 0 :(得分:4)
从lambda函数抛出异常与从任何其他函数抛出异常等效。
现在,如果在这样的背景下抛出异常是一种很好的做法,那么我的拙见不是。例外意味着用于异常情况(例如,子弹刺穿你的CPU),我不认为达到范围的结尾是合格的(即例外)。
答案 1 :(得分:2)
我认为这取决于你想要完成的事情。我个人会将检查空队列留给调用pop的函数。似乎没有理由用例外来限制队列的功能。当队列为空时,您可能希望处理某些情况,但抛出异常并处理这种情况似乎会导致代码膨胀给我。
只是我的偏好。
答案 2 :(得分:0)
我在处理我的一个项目时问自己这个问题。
我同意可以使用它的答案,但最好只将其限制在特殊情况下(特别是因为抛出时,异常并不便宜)。
在我的情况下,我使用lambda在升级过程中多次保存文件(所有节省的代码都相同,如果失败,我认为它是一个例外,因为它不应该发生)。 / p>
我的项目的伪代码:
void upgradeFile(/* params */){
std::string configVersion = readCurrentConfigVersion();
auto fSaveFileAfterUpgrade = [](/* params */){
if(!param1.saveFile(/*params*/)){
throw std::runtime_error("My error Message");
}
};
if(configVersion == "1.0"){
const std::string versionAfterUpgrade = "1.1";
// UPGRADE CODE...
fSaveFileAfterUpgrade(/* params */);
configVersion = versionAfterUpgrade;
}
if(configVersion == "1.1"){
const std::string versionAfterUpgrade = "1.1a";
// UPGRADE CODE...
fSaveFileAfterUpgrade(/* params */);
configVersion = versionAfterUpgrade;
}
}
如果lambda中发生异常,则调用upgradeFile的函数将处理它(我设置了try catch)。