C ++使用调用跟踪进行异常处理

时间:2014-05-07 00:26:01

标签: c++ exception-handling

我需要为非常大的C ++代码实现异常处理系统。我需要实现符合以下规范的标准:

  • 在抛出异常时打印出呼叫追踪
  • 允许开发人员在调用异常时指定有关函数状态的可选附加信息。 (例如,迭代期间计数器的值)
  • 易于实施(因为我自己无法做到)
  • Uninvasive
  • 便携式

在我看来,似乎在每个函数中放置try / catch块是唯一可行的解​​决方案,但这似乎很不好并被认为是不好的做法。它也很笨拙,难以维持/实施。

我也研究过堆栈跟踪等库,但它们似乎在可移植性方面受到限制,我不得不牺牲可选的附加状态信息的能力。

编辑:执行此操作的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

良好的要求清单!当然,获取堆栈跟踪不是可移植的,但所有流行的编译器都允许进行堆栈跟踪。您可以开始查看backtrace / backtrace_symbols函数(gcc,clang)。这是一个example

关于第二点 - 你最好用字符串消息限制你的异常类。根据我的经验,传递任意信息并不是很有用(除输出错误消息外,您还有哪些其他处理选项?)。如果您仍然坚持将类型化数据链接到异常boost :: exception将完成这项工作。

您还可能希望将“链式异常”项添加到需求列表中。它是有用的功能,尤其是当您的应用程序有多个图层并且您重新抛出原始异常一次或多次时。 C ++ 11允许轻松实现链式异常。请参阅example of implementationtest cases,了解如何使用它。

关于第4点 - C ++异常不是侵入性的(在某种意义上)。你甚至不必抓住它。如果从std :: exception继承你的异常类并提供what()的正确实现,catch方将处理你抛出的任何东西。