如果抛出异常,我想有办法向用户报告堆栈跟踪.做这个的最好方式是什么?是否需要大量的额外代码?
回答问题:
如果可能的话,我希望它是便携式的.我想要弹出信息,因此用户可以复制堆栈跟踪并在出现错误时通过电子邮件发送给我.
这取决于哪个平台.
在海湾合作委员会这是非常微不足道的,请看这篇文章了解更多细节.
在MSVC上,您可以使用StackWalker库来处理Windows所需的所有底层API调用.
您必须找出将此功能集成到您的应用程序的最佳方法,但您需要编写的代码量应该是最小的.
安德鲁·格兰特的回答并不能帮助得到的堆栈跟踪投掷功能,至少不会与海湾合作委员会,因为throw语句不保存自身当前的堆栈跟踪和捕捉处理程序将无法访问的堆栈跟踪那一点.
使用GCC解决此问题的唯一方法是确保在throw指令的点处生成堆栈跟踪,并使用异常对象保存它.
当然,此方法需要抛出异常的每个代码都使用该特定的Exception类.
2017年7月11日更新:对于一些有用的代码,请看看cahit beyaz的答案,它指向http://stacktrace.sourceforge.net - 我还没有使用它,但它看起来很有希望.
如果您使用的是Boost 1.65或更高版本,则可以使用boost :: stacktrace:
#include// ... somewhere inside the bar(int) function that is called recursively: std::cout << boost::stacktrace::stacktrace();
Unix: 回溯
Mac: 回溯
Windows:CaptureBackTrace
我想添加一个标准的库选项(即跨平台)来生成异常回溯,C ++ 11已经提供了该选项:
std::nested_exception
和std::throw_with_nested
这不会给您带来很多麻烦,但我认为下一件好事。它在此处和此处的 StackOverflow上进行了介绍,如何通过简单地编写适当的异常处理程序(该异常处理程序将重新抛出嵌套的异常)来获得对代码内异常的追溯,而无需调试程序或繁琐的日志记录。
由于您可以使用任何派生的异常类执行此操作,因此可以向此类回溯中添加很多信息!您还可以在GitHub上查看我的MWE,回溯显示如下:
Library API: Exception caught in function 'api_function' Backtrace: ~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed ~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"