编辑:这本书没有任何问题,我无法正确复制其中提供的代码。 try-catch
块应该在while循环中,而我把它放在它之外。
关于Stroutrup的“编程:使用C ++的原理和实践”,我在第7章第7节(“从错误中恢复”)中可能会遗漏一些东西。我希望读过这本书的人能够帮助我(或任何人,实际上!)。
我们开发了一个带有令牌解析器的计算器。当程序读取无效令牌时,它就会终止。第7节的目标是使计算器从这些错误中恢复而不终止。我的问题是,在遵循本书的指令后,计算器仍会在无效令牌后终止。
Here是计算器的完整代码。 Here是std_lib_facilities.h,以防您需要它来理解代码。
正如您所看到的,main()
调用calculate()
,如果抛出异常(在读取无效令牌时会发生这种情况),则clean_up_mess()
会调用clean_up_mess()
。 {{1}}然后删除Token_stream中的所有内容,直到找到 print char(';'),这样我们就可以继续进行下一次计算,希望不会包含另一个无效令牌。< / p>
但是在异常处理完成后,程序才会终止。我需要做些什么来恢复抛出异常的地方?作者是否忘记解释这个,或者我错过了什么?
感谢。
答案 0 :(得分:4)
处理异常后,C ++继续执行 catch
块之后的代码。它不会从抛出异常的地方“恢复”。
解决方案是将try
/ catch
阻止移到<{1}}的{{1}}循环中:
while
答案 1 :(得分:1)
这不是一个简单的问题需要解决。我的意思是,只是指出错误不会解决它。当您发现异常时,请致电clean_up_mess()
:
catch (exception& e)
{
cerr << e.what() << endl;
clean_up_mess();
}
然而,该功能刚刚退出。在main()
中,除了调用calculate()
之外,您不会执行任何其他操作,因此无论如何都会结束。在您的clean_up_mess函数中,您只需使流忽略有问题的条目,但其他任何内容。
您必须将代码置于循环中,以便能够执行。
答案 2 :(得分:1)
在你的情况下,while
循环读取输入是在try-catch块内。因此,当抛出异常时,循环终止并在处理异常后返回函数。你需要做的是将try-catch块放在while循环中,以便它继续读取和处理输入。