编辑:这本书没有任何问题,我只是无法正确复制其中提供的代码。当我将try-catch块放置在while循环之外时,它应该位于while循环内。

关于Stroutrup的“编程:使用C++的原理和实践”,在第7章第7节(“从错误中恢复”),我可能会缺少一些东西。我希望读过这本书的人能够帮助我(或者实际上是任何人!)。

我们开发了带有 token 解析器的计算器。当程序读取无效 token 时,它将终止。第7节的目标是使计算器从此类错误中恢复而不会终止。我的问题是,在遵循本书的指令之后,计算器在无效 token 后仍会终止。

Here是计算器的完整代码。 Here是std_lib_facilities.h,以防您需要它来理解代码。

如您所见,main()调用calculate(),如果抛出异常(当读取无效 token 时发生),它又调用clean_up_mess()。然后clean_up_mess()从Token_stream中删除所有内容,直到找到打印字符(';'),因此我们可以继续进行下一个计算,希望该计算将不包含另一个无效的 token 。

但是,在完成异常处理后,该程序将终止。我需要做些什么才能使其在引发异常的地方恢复?并且作者忘了解释吗,还是我错过了什么?

谢谢。

最佳答案

处理异常后,C++继续执行catch块之后的代码。它不会从引发异常的位置“恢复”。

解决方案是将try / catch块移到whilecalculate()循环内:

void calculate()
{
    while (cin) {
        try {
            cout << prompt;
            Token t = ts.get();
            while (t.kind == print)
                    t=ts.get();
            if (t.kind == quit) {
                    return;
            }
            ts.putback(t);
            cout << result << expression() << endl;
         } catch (exception& e) {
             cerr << e.what() << endl;
             clean_up_mess();
         }
    }
}

关于c++ - Stroustrup的PPP使用C++:第7章,第7节(“Recovering from errors”),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11496313/

10-10 17:52