我为sublimetext3开发了一个插件,python代码使用c类型绑定到clang。有时调用libclang会与libclang: crash detected during reparsing
相混淆(我还不明白原因,但这与这个问题无关)。这将导致插件主机崩溃。在
所以问题是:python中有没有方法可以从底层c绑定的失败中恢复过来?我很乐意跳过这个特别的文件,我经历了崩溃。在
谢谢!在
UPD:在评论中有一个简短的讨论,有必要进一步阐述缺乏适当的小型可重复的例子。这并不是因为我的懒惰,我确实尽可能地让那些我希望得到帮助的人理解这个问题。但在这种情况下,这真的很难。最初的问题是由Libcang在一些我还没弄清楚的奇怪情况下的分裂引起的。这可能与一个库在不支持c++11的情况下编译,而另一个在使用c++11支持的情况下使用它有关,但我要强调的是,这与问题无关。这里的问题是在python调用的东西中有一个segfault,这个segfault导致Sublime Text plugin_host退出。这里有一个简单的例子,但不是因为缺乏尝试。我也愿意接受建议,如果你有想法如何建设一个。很抱歉这个问题的质量很差,这是我目前最好的。在
根据我所掌握的细节,我确信您的问题可以归结为“Python可以处理使用外部函数接口时发生的错误吗?”
我很确定答案是“不”,我将以下测试场景结合起来解释原因:
这是我们的测试C++模块(对于名字的使用目的有点C),它会在我们的脸上爆炸,^ {CD1>}:
以及我们的调用脚本
^{pr2}$test.py
:叫它:
这会使Python崩溃,并在OS X上生成一个漂亮的“报告错误”详细信息:
我复制并粘贴它是因为它比strace更干净/更容易解析(而且,我很懒;)。 对
__kill
的调用是我们崩溃的地方;我们从未看到Python的返回,这意味着它超出了我们的控制范围。在为了证明这一点,请将我们的
test.py
修改为test_handle_exception.py
,以尝试捕捉异常:再运行一次:
不幸的是,据我所知,我们无法在Python层捕获异常/崩溃,因为它发生在字节码的控制之下。一个非特定的
Exception
子句将尝试捕捉任何发生的异常,其中以下语句是捕获异常时所采取的操作。If you're reading this, we survived somehow.
从未发送到stdout,我们崩溃了,这意味着Python没有机会做出反应。在如果可以,请处理C++代码中的异常。您可能可以获得创造性,并使用multiprocessing来切入一个进程,该进程可以在不关闭主进程的情况下崩溃,但我对此表示怀疑。在
相关问题 更多 >
编程相关推荐