编辑:这本书没有任何问题,我只是无法正确复制其中提供的代码。当我将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
块移到while
的calculate()
循环内:
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/