我目前正在解析一个令牌队列:我写了一个lambda函数,如果queue.begin() == queue.end()
,就会抛出异常,而不是为每个后续的pop()
检查队列是否为空。我想知道这是一个好的、“适当”的实现,还是一般认为从lambda表达式中抛出异常是一种不好的实践?
从lambda函数中抛出异常与从任何其他函数中抛出异常相同。
现在,如果在这种情况下抛出异常是一个好的实践,在我看来并不是。异常应该在异常情况下使用(例如,子弹穿过了您的CPU),而我不认为到达范围的末尾符合此类情况(即,异常情况)。
我认为这取决于你想要达到什么目的。我个人会将检查空队列的操作留给调用pop函数的函数。似乎没有理由通过异常来限制队列的功能。也许有一些情况下你需要处理空队列,但是对我来说,抛出异常并处理这种情况似乎会导致代码膨胀。
这只是我的个人偏好。
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)。