繁体   English   中英

将异常堆栈跟踪从 C++ 传递到 Python(通过 Cython)

[英]Passing exception stack traces from C++ to Python (via Cython)

问题

我在 Python 中有一个无法(也不想修改)的日志记录和基础设施系统,它依赖于异常的Traceback

我有用 Cython 包装的 C++ 代码。 此 C++ 代码可能会引发异常 ( std::runtime_errors )。 Cython 提供了翻译异常的能力(例如,使用except + )。 但是,这当然是有道理的,翻译只翻译异常类型和消息。

就我而言,我想将 C++ 异常(我可以恢复为字符串)中的堆栈跟踪转换为 Python 的Traceback 显然,翻译并不完全有意义,但它允许我“作弊”并继续(或替换)Python 中的堆栈跟踪,用代表 C++ 中的堆栈跟踪的东西。

假设我可以将 C++ 异常的堆栈跟踪解析为有意义的值,我想知道实现这一目标的最佳方法是什么。 我在下面列出了一个想法,我很乐意听取您的意见或分享替代方案。

我要补充一点,这整个事情感觉很不稳定,但我对此既好奇又想避免做一些事情,比如将 C++ 堆栈跟踪放在 Python 的异常消息中。

我的想法

所以看了一会儿,我发现CPython有一个叫做_PyTraceback_Add的方法。 具体来说,它的签名是void _PyTraceback_Add(const char *funcname, const char *filename, int lineno)并且看起来它会将值( funcnamefilenamelineno )添加到当前跟踪中。 实现链接: https://github.com/python/cpython/blob/66f77caca39ba39ebe1e4a95dba6d19b20d51951/Python/traceback.c#L257

当我在 Cython 中提出 Python 异常时,我的想法是正确使用它。 然后,我可以使用 C++ 中的异常字符串并将值插入到现有跟踪中。

但是,这种方法在CPython中似乎是私有的,我不确定在生产代码中依赖它是否合理。

这个解决方案有什么好的替代方案吗?

谢谢!

那么 function 似乎只使用公共 API,所以可以只执行相同的步骤。

话虽如此,它看起来不太可能很快改变。

此外,似乎有人已经在做您正在做的事情:请参阅问题#24743

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM