【问题标题】:Throw runtime warnings in C++在 C++ 中引发运行时警告
【发布时间】:2013-03-16 12:19:17
【问题描述】:

几周前我开始使用异常,现在我想知道是否有办法只发出警告。如果未捕获此警告,则不应强制应用程序退出。我会给你一个例子,我想在什么情况下使用它。

有一个系统可以将属性附加到唯一 ID。当我以某种方式尝试将属性添加到尚不存在的 id 时,系统应在内部为我创建该 id,然后将属性添加到它并返回结果。当然,这不能安静地完成。但由于应用程序可以继续运行,我不想抛出异常。

我如何通知有些事情不太正确,但系统仍在运行?

【问题讨论】:

  • 是的,写入标准错误或某种日志。没有类似异常的机制。

标签: c++ exception warnings robustness


【解决方案1】:

您想通知谁?最终用户?在这种情况下,只需向cerr 写一条合适的消息即可。或者更好的是,编写一个包装函数(例如LOG_WARNING())以受控方式执行此操作。或者更好的是,使用logging framework


但由于应用程序可以继续运行,我不想抛出异常。

请注意,异常不一定会导致应用程序终止。您可以捕获堆栈更高的异常,并适当地处理这种情况。

【讨论】:

    【解决方案2】:

    不,这是不可能的。您只能抛出和捕获异常。如果你想成为 厚脸皮 你可以这样做

    class warning : public std::exception
    {
    public:
         warning(const std::string& msg) {}
         const char* what() { return msg.c_str(); } //message of warning
    private:
         std::string msg;
    };
    

    那么你可以:

    throw warning("this is a warning");
    

    如果你愿意,这可能是一个人为制造的警告系统。

    【讨论】:

    • 谢谢,我需要捕获这个自定义异常吗?
    • @sharethis 是的,你会使用你的warning,就像你使用异常一样。所以你必须try {} catch(warning& w) {}` 它。
    • @sharethis:您可以使用这个系统,但这不是一个明智的想法(我认为 Tony 在他的回答中暗示了这一点)。您应该使用传统的日志记录机制,而不是滥用异常......
    【解决方案3】:

    虽然没有发出警告。我相信您正在寻找的功能可从errno

    您可以将其设置为the standard errors 中的任何一个,或编写您自己的错误代码。 (不过,请好好记录它们。)

    如果您的库旨在供其他开发人员使用,这可能会很有用。一个可能有用的例子是使用 JSON 解析器。 JSON 支持具有任意精度的任意大数字。因此,如果您的解析器在内部使用双精度数来表示数字,如果它遇到一个无法表示的数字,那么它可以将数字四舍五入到最接近的可表示数字集合errno=EDOM;(参数超出范围),它会留下决定由开发人员决定四舍五入是否重要。如果你想变得超级好,你甚至可以添加一种方法来检索回合的位置,甚至可能使用原始文本。

    综上所述,这只应在以下情况下使用:

    • 在某些情况下确实可以完全绕过警告
    • 警告的根源输入到您正在编写的库中
    • 在某些情况下,图书馆的使用者可能会关心警告,但大多数时候不会。
    • 没有更合适的方式来返回信息(例如通过引用传递的状态,具有不需要状态的重载)

    【讨论】:

      【解决方案4】:

      只需将消息打印到 stderr 或您的日志。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-02
        • 2022-08-23
        • 2022-01-21
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多