【问题标题】:Shall I use cerr我应该使用 cerr
【发布时间】:2011-02-20 17:34:06
【问题描述】:

在下面描述的情况下使用 cerr 是否风格良好?

try
    {
    cout << a + b;
    }
    catch(const IntException& e)
    {
        cerr << "Exception caught: " << typeid(e).name(); //using cerr not cout
    }
    catch(...)
    {
        cerr << "Unknown exception.";//using cerr not cout
    }

还是应该使用 cout?见代码中的 cmets。

【问题讨论】:

  • 在不重新抛出异常或终止程序的情况下,catch (...) 是个坏主意。你不知道异常是什么,也绝对没有办法知道继续执行是否安全。
  • @James,你知道我需要这个做什么吗?

标签: c++


【解决方案1】:

stderr 是发送错误消息的传统流(以便 OS/shell/whatever 可以将错误消息与“正常”输出分开捕获),所以是的,使用std::cerr

我不评论仅仅捕获异常并将其打印出来是否比简单地让异常传播到您的应用程序之外更好......

【讨论】:

    【解决方案2】:

    是的,因为虽然默认情况下它们都转到终端,但您可以更改它们的输出指向的位置,并且您可能希望 cerr 转到日志文件,而 cout 继续转到 stdout .

    从本质上讲,如果您现在或将来需要,它可以让您更好地控制不同输出的去向。

    【讨论】:

    • 您可能需要改写它; stderrstdout 通常都被重定向到终端输出;这与说“stderr 转到stdout”不同!
    • 谢谢,对于疏忽感到抱歉。虽然从技术上讲,如果它是同一个地方,它不是错误,但确实如此。 (我不是在嘲笑你,但我们是程序员!奇怪的技术就是一切;))
    【解决方案3】:

    当然,在那里使用 cerr 很好。您可以以不同于 cout 的方式重定向 cerr,有时这可以帮助您突出显示可能隐藏在巨大 cout 日志文件中的问题。

    【讨论】:

      【解决方案4】:

      要记住的一个细节是,将输出直接发送到终端(使用 cout 或 cerr),确实会限制您测试错误消息的能力。提出“我如何对此进行单元测试?”这个问题总是值得的。

      【讨论】:

        猜你喜欢
        • 2019-10-17
        • 2013-03-12
        • 2023-03-10
        • 2016-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 2015-07-26
        相关资源
        最近更新 更多