Stroustrup使用C ++的PPP:第7章第7节(“从错误中恢复”)

时间:2012-07-15 22:51:04

标签: c++

编辑:这本书没有任何问题,我无法正确复制其中提供的代码。 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>

但是在异常处理完成后,程序才会终止。我需要做些什么来恢复抛出异常的地方?作者是否忘记解释这个,或者我错过了什么?

感谢。

3 个答案:

答案 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循环中,以便它继续读取和处理输入。