抛出lambda表达式的异常,坏习惯?

时间:2016-05-07 19:06:28

标签: c++ c++11

我正在解析一个令牌队列:而不是检查每个后续pop()队列是否为空我已经写了一个lambda抛出异常queue.begin() == queue.end()。我想知道这是一个好的,“正确”的实现,还是一般认为从lambda表达式抛出异常是一种不好的做法?

3 个答案:

答案 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)。