问题描述
问题
我有一个我不能(也不想修改)的日志记录和基础设施系统,在 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)
、funcname
和 filename
)添加到当前跟踪中。实施链接:https://github.com/python/cpython/blob/66f77caca39ba39ebe1e4a95dba6d19b20d51951/Python/traceback.c#L257
当我在 Cython 中引发 Python 异常时,我的想法是使用它。然后,我可以使用 C++ 中的异常字符串并将值插入到现有跟踪中。
但是,此方法在 lineno
中似乎是私有的,我不确定在生产代码中依赖它是否合理。
这个解决方案有什么好的替代方案吗?
谢谢!