C ++:有关运行时警告错误和消息的最佳实践是什么?

时间:2018-02-07 12:42:05

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

今天早上再次开始使用SDL2,虽然这里的示例中使用SDL的事实并不相关,但为了这个问题的目的,我们可以考虑任何可能产生运行时错误的框架/工具包/库。 / p>

开始编写以下代码:

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 ++程序中出现错误消息和警告消息的最佳做法是什么?有哪些好的解决方案可供使用,何时使用合适?

1 个答案:

答案 0 :(得分:3)

使用宏是一种很好的做法。它允许隐式使用__FILE____LINE____func__等。例如,BOOST_THROW_EXCEPTION将所有关于异常的元数据捆绑在一起。

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

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