微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将异常堆栈跟踪从 C++ 传递到 Python通过 Cython

问题

我有一个我不能(也不想修改)的日志记录和基础设施系统,在 Python 中,它依赖于异常的 https://<USERNAME>:<PASSWORD>@MyMirror.blah

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

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

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

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

我的想法

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

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

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

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

谢谢!

解决方法

该函数似乎只使用公共 API,因此可以执行相同的步骤。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。