【问题标题】:C++: What are the best practices regarding runtime warning errors and messages? [closed]C++:关于运行时警告错误和消息的最佳实践是什么? [关闭]
【发布时间】:2018-07-17 18:17:05
【问题描述】:

今天早上又开始玩 SDL2,虽然与此处示例中使用 SDL 的事实无关,但出于这个问题的目的,我们可以考虑任何可能产生运行时错误的框架/工具包/库。

开始编写以下代码:

if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
    std::cerr << SDL_GetError() << std::endl;
}

我认为这不是很好。

  • 这种将消息输出到cerr 的方式在未来如果需要的话不容易改变。如果我们想将错误消息打印到文件中,那么我们必须找到所有出现的这段代码,并将cout 更改为文件。这显然既不实用也不容易。

  • 它不是很灵活。也许我们可能希望有错误、警告和一般信息消息。根据用户如何配置我们的程序,他们可能需要去不同的地方。也许有些用户想查看所有警告和信息,而另一些用户只想看到最“关键”的错误消息。

在其他项目中,我看到使用的东西看起来像宏。

例如,我想到了以下内容:

DT_THROW_IF(condition, "message");

我的假设是这是作为宏实现的。如果condition 的计算结果为true,则message 将出现在输出中。 (cout/cerr)

使用这样的宏可能会在某种程度上解决上述问题,但我听说it is not good practice to make extensive uses of macros

  • 在 C 或 C++ 程序中处理错误消息和警告消息的最佳实践是什么?有哪些好的解决方案可用,何时适合使用?

【问题讨论】:

  • 不要同时添加 c++ 和 c 标签,它们完全不同。
  • 投票结束为“基于意见”。正如您在问题中所说明的那样,有很多方法可以客观地实现这一目标。
  • 也许更适合Software Engineering
  • 我在几乎所有的应用程序中都使用了类似 boost:log 的记录器。
  • @RichardCritten 这不是真的。除了简单性之外,我给出的示例在所有可能的指标上客观上都差很多。

标签: c++ c error-handling macros runtime-error


【解决方案1】:

为此使用宏是一种很好的做法。它允许隐式使用__FILE____LINE____func__ 等。例如,BOOST_THROW_EXCEPTION 为您捆绑了有关异常的所有这些元数据。

就我个人而言,我总是创建一组特定于项目的宏,类似于您的DT_THROW_IF。这允许在投掷站点捕获完整的元数据而不会造成混乱。如果宏构造得当,就没有缺点,而且很少需要修改或维护。

作为我所说的一个例子,这是我的一个开源项目,它有这样的宏:https://github.com/jzwinck/pccl/blob/master/throw.hpp - 它们已经过生产测试(使用 GCC),欢迎您使用它们。

【讨论】:

  • 对于 C++ 的所有模板和对象愚蠢,它从未完全取代宏。完全谈论坏坏宏只是为了阻止新手程序员过度使用它们。
  • 有趣的练习:为不实现可变参数宏但仍捕获__FILE____LINE____function__ 的旧编译器想出像您这样的日志记录宏。
  • @AndrewHenle:我链接的宏依赖于 C++11(可变参数模板),而不仅仅是可变参数宏。我会惊讶地发现一个支持前者但不支持后者的编译器......但可能有一个。
  • __FILE____LINE__ 与宏有什么关系?什么是__function__,你的意思是标准的__func__?这些都不依赖于预处理器。
  • @Lundin 函数和其他抽象工具未内联在应引发错误的源中。如果您在report_error 函数中使用__LINE__,那么__LINE__ 将引用该函数,而不是调用者,正如您在错误报告中所期望的那样。话虽如此,我们最终可能会得到std::source_location...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多