几周前我开始使用异常,现在我想知道是否有办法只发出警告。如果未捕获此警告,则不应强制应用程序退出。我会给你一个例子,我想在什么情况下使用它。
有一个系统可以将属性附加到唯一 ID。当我以某种方式尝试将属性添加到尚不存在的 id 时,系统应在内部为我创建该 id,然后将属性添加到其中并返回结果。当然,这不能安静地完成。但由于应用程序可以继续运行,我不想抛出异常。
我如何通知某些事情不太正确,但系统仍在运行?
几周前我开始使用异常,现在我想知道是否有办法只发出警告。如果未捕获此警告,则不应强制应用程序退出。我会给你一个例子,我想在什么情况下使用它。
有一个系统可以将属性附加到唯一 ID。当我以某种方式尝试将属性添加到尚不存在的 id 时,系统应在内部为我创建该 id,然后将属性添加到其中并返回结果。当然,这不能安静地完成。但由于应用程序可以继续运行,我不想抛出异常。
我如何通知某些事情不太正确,但系统仍在运行?
你想通知谁?最终用户?在这种情况下,只需向cerr
. 或者更好的是,编写一个包装函数(例如LOG_WARNING()
)以受控方式执行此操作。或者更好的是,使用日志框架。
但由于应用程序可以继续运行,我不想抛出异常。
请注意,异常不一定会导致应用程序终止。您可以捕获堆栈更高的异常,并适当地处理这种情况。
不,那是不可能的。您只能抛出和捕获异常。如果你想厚脸皮,你可以这样做
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");
如果您愿意,这可能是一个人为制造的警告系统。
虽然没有发出警告。我相信您正在寻找的功能可从errno
您可以将其设置为任何标准错误或编写自己的错误代码。(不过,请好好记录它们。)
如果您的库旨在供其他开发人员使用,这可能会很有用。一个可能有用的例子是使用 JSON 解析器。JSON 支持具有任意精度的任意大数字。因此,如果您的解析器在内部使用双精度数来表示数字,如果它遇到一个它无法表示的数字,那么它可以将数字四舍五入到最接近的可表示数字集合errno=EDOM;
(参数超出范围),它将决定留给开发商关于四舍五入是否重要。如果你想变得超级好,你甚至可以添加一种方法来检索回合的位置,甚至可能使用原始文本。
综上所述,这只应在以下情况下使用:
只需将消息打印到 stderr 或您的日志。