这个线程对我来说非常有用,但是当我尝试在没有回溯的情况下提取错误消息本身时,我遇到了 Python C API 的问题。我在 Python 中找到了很多方法来做到这一点,但在 C++ 中我找不到任何方法来做到这一点。我终于想出了以下版本,它尽可能少地使用 C API,而更多地依赖于 boost python。
PyErr_Print();
using namespace boost::python;
exec("import traceback, sys", mainNamespace_);
auto pyErr = eval("str(sys.last_value)", mainNamespace_);
auto pyStackTrace = eval("'\\n'.join(traceback.format_exception(sys.last_type, sys.last_value, sys.last_traceback))", mainNamespace_);
stackTraceString_ = extract<std::string>(pyStackTrace);
errorSummary_ = extract<std::string>(pyErr);
之所以可行,是因为PyErr_Print()还设置了sys.last_value
、sys.last_type
和的值sys.last_traceback
。这些设置为与sys.exc_info
给出的相同的值,因此这在功能上类似于以下 python 代码:
import traceback
import sys
try:
raise RuntimeError("This is a test")
except:
err_type = sys.exc_info()[0]
value = sys.exc_info()[1]
tb = sys.exc_info()[2]
stack_trace = "\n".join(traceback.format_exception(err_type, value, tb))
error_summary = str(value)
print(stack_trace)
print(error_summary)
我希望有人觉得这很有用!