C ++异常处理指南

时间:2014-04-03 10:07:00

标签: c++ oop design-patterns boost exception-handling

我正在推特网站上阅读此文档Error Handling。 在第五点我发现了这个建议。

  

块引用   “不要过多担心what()消息。很高兴有一个消息,程序员有机会搞清楚,但你很可能无法编写一个相关的,用户可理解的错误消息抛出一个异常。当然,国际化超出了异常类作者的范围.Peter Dimov提出了一个很好的论据,即正确使用what()字符串作为错误消息格式化表的一个关键。现在,只要我们能够标准化标准库抛出的异常的what()字符串......“

我想知道如何实现这一目标(以语言无关的方式),但我不是那么有经验......你能举一些例子吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

正如经常发生的那样,“它取决于”: - )

我发现what()方法在为高级用户编写的命令行应用程序中非常有用(我开发科学软件)。在这里,国际化并不是一个问题,因为每个人都理解英语,在大多数情况下,确实可以提供对用户有意义的错误消息。

我经常使用的另一种方法是“错误类”。这个类的一个实例在主应用程序运行时“收集”错误消息和警告,并打印仅在退出时收集的内容。它看起来像这样(只显示骨架来说明原理):

class Errors {
  public:

  void add_error(const std::string& errmsg);
  void add_warning(const std::string& warnmsg);

  // print all errors and warnings
  void print(std::ostream& out) const;

  // no errors, no warnings
  bool perfect() const { return (_errs.size() + _warns.size()) == 0; }

  // no errors, maybe some warnings
  bool ok() const { return _errs.size() == 0; }

  // ...

  private:
  std::vector<std::string> _errs, _warns;
};

what()的输出可以直接保存在Errors对象中:

try {
  // ...
} catch (const std::exception& ex) {
  errors.add_error(ex.what());
  // ...
}

或者您可以通过翻译catch的输出或使用封装必要信息的复杂异常对象,在what()块中生成非常好的错误消息(可能是国际化的)。然后在程序结束时,您可以通过调用print()方法为用户提供错误的完整列表。

最后,如果您为“非专家用户”编写软件,则上述其他人注意到的所有注意事项均适用。基本上,应该呈现国际化,易于理解的错误消息,并且尽可能少。你应该“隐藏”例外,可以这么说。没有人喜欢弹出窗口“错误#x7582764发生,退出”: - )

答案 1 :(得分:1)

错误报告的问题很复杂。对此的评论 Boost站点主要与库代码相关;没有 真正标准的国际化处理方式 例如,您无法生成与语言相关的消息 图书馆级别(除非图书馆采用一种特定方式 处理它,你通常不想要)。第二 点更为一般。如果,甚至忽视国际化 例外是图书馆代码的深层次,它不太可能 您可以创建对用户有意义的消息。 在这种情况下,您可以做的最好的事情就是传递足够的信息 以便应用程序可以捕获错误并生成 在它正在做的事情的背景下有意义的信息。从而, 你可能会而不是像"no entry 'xyz' in table"这样的东西 想要输出"Unknown type 'xyz' when deserializing data in file 'abc'"