我正在推特网站上阅读此文档Error Handling。 在第五点我发现了这个建议。
块引用 “不要过多担心what()消息。很高兴有一个消息,程序员有机会搞清楚,但你很可能无法编写一个相关的,用户可理解的错误消息抛出一个异常。当然,国际化超出了异常类作者的范围.Peter Dimov提出了一个很好的论据,即正确使用what()字符串作为错误消息格式化表的一个关键。现在,只要我们能够标准化标准库抛出的异常的what()字符串......“
我想知道如何实现这一目标(以语言无关的方式),但我不是那么有经验......你能举一些例子吗?
谢谢!
答案 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'"
。