错误处理

  由于这个程序如此简单,错误处理也就没有作为一个主要的考虑。这里的错误处理程序简单地统计错误次数,写出一条错误信息后返回:

    int no_of_errors;
    double error(const string& s)
    {
        no_of_errors++;
        cerr << "error: " << s << '\n';
        return 1;
    }

流cerr是一个非缓冲的输出流,通常用于报告错误(21.2.1节)。

  在这里返回一个值,这是因为错误通常是在表达式求值期间遇到的,因此我们就需要或者是让这次计算整个流产,或者是返回一个不大会在后面引起问题的值。对这个简单计算器,采用后一种方式是很合适的。让get_token()记录行的编号,将使error()能够通知用户出错的大致位置,这一做法对于非交互式地使用计算器将很有帮助(6.6[9])。

  常有的情况是,程序在出现了一个错误后就必须终止,因为我们无法安排一种有意义的继续方式。需要这样做时可以调用exit(),该函数将首先清理诸如输出流等,而后结束这一程序,并以自己的参数作为程序的放回值(9.4.1.1节)。

  更有特色的错误处理机制可以通过异常(8.3节、第14章)实现,但对于一个大约150行的小计算器而言,我们现在的做法已经很合适了。

🔚