C++异常处理准则
C++ Exception Handling Guidelines
我正在阅读这个文档 错误处理 在提升网站上。在第五点中,我发现了这个建议。
块引用 "不要太担心what()消息。很高兴有一条程序员有机会弄清楚的消息,但是在引发异常时,您不太可能编写相关且用户可理解的错误消息。当然,国际化超出了异常类作者的范围。Peter Dimod提出了一个很好的论点,即what()字符串的正确使用是作为错误消息格式化程序表的键。现在,如果我们能为标准库抛出的异常获得标准化的 what() 字符串......"
我想知道如何实现这一点(以与语言无关的方式),但我没有那么有经验..你能举一些例子吗?
谢谢!
正如经常发生的那样,"这取决于":-)
我发现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());
// ...
}
或者,您可以通过翻译 what()
的输出或使用封装必要信息的复杂异常对象,在 catch
块中生成非常好的错误消息,可能是国际化的。然后在程序结束时,您可以通过调用 print()
方法为用户提供错误的完整列表。
最后,如果您为"非专家用户"编写软件,那么上述其他人指出的所有警告都适用。基本上,应该显示国际化的、易于理解的错误消息,并且尽可能少。可以这么说,您应该"隐藏"例外。没有人喜欢弹出窗口说"错误 #x7582764 发生,正在退出":-)
错误报告的问题很复杂。 对提升站点主要与库代码相关;没有真正标准的国际化处理方式,对于示例,因此您无法在库级别(除非库采用一种特定方式处理它,你通常不想要)。 第二个点更笼统。 甚至忽略国际化,如果例外存在于库代码中,极不可能您可以创建对用户有意义的消息。在这种情况下,你能做的最好的事情就是传递足够的信息以便应用程序可以捕获错误并生成在它正在做的事情的背景下,这是一个有意义的信息。 因此而不是像"no entry 'xyz' in table"
这样的东西,你可能会想要输出"Unknown type 'xyz' when deserializing data in
file 'abc'"
.
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- 异常处理期间的类型解析