我需要为非常大的 C++ 代码实现一个异常处理系统。我需要实现符合以下规范的标准:
- 抛出异常时打印出调用轨迹
- 允许开发人员在调用异常时指定有关函数状态的可选附加信息。 (例如迭代期间计数器的值)
- 易于实现(因为我自己做不到)
- 无创
- 便携
在我看来,似乎将 try/catch block 放在每个函数中是唯一可能的解决方案,但这似乎通常被认为是错误的做法。它也很笨拙且难以一致地维护/实现。
我也研究过像 stacktrace 这样的库,但它们的可移植性似乎有限,我将不得不牺牲可选的附加状态信息的能力。
编辑:最好的方法是什么?
很好的要求列表!当然,获取堆栈跟踪是不可移植的,但所有流行的编译器都允许获取堆栈跟踪。您可能会开始查看 backtrace/backtrace_symbols 函数(gcc、clang)。这是一个 example .
关于第二点——你最好用字符串消息来限制你的异常类。根据我的经验,传递任意信息并不是很有用(除了输出错误消息,您还有哪些其他处理选项?)。如果您仍然坚持将类型化数据链接到异常 boost::exception 将完成这项工作。
您可能还想将“链式异常”项添加到您的需求列表中。这是一个很有用的功能,尤其是当您的应用程序有多个层并且您重新抛出原始异常一次或多次时。 C++11 允许轻松实现链式异常。参见 example of implementation和 test cases显示如何使用它。
关于第 4 点 - C++ 异常不是侵入性的(在某种意义上)。你甚至不必捕获它。如果您从 std::exception 继承异常类并提供 what()
的正确实现,则 catch 端将处理您抛出的任何内容。