3

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

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

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

4

4 回答 4

4

你想通知谁?最终用户?在这种情况下,只需向cerr. 或者更好的是,编写一个包装函数(例如LOG_WARNING())以受控方式执行此操作。或者更好的是,使用日志框架


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

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

于 2013-03-16T12:22:20.210 回答
1

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

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");

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

于 2013-03-16T12:22:54.433 回答
1

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

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

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

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

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

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

于 2013-03-16T12:21:26.667 回答