![]() |
1
11
正如您在问题中已经指出的那样,这里真正的问题是如何处理从C++执行的python代码中引发的未处理异常。所以这不仅仅是关于信号:它还影响重新实现的虚拟方法。
在PySide、PyQt4以及5.5之前的所有PyQt5版本中,默认行为是自动捕获C++端的错误,并将回溯转储到stderr。通常,python脚本在此之后也会自动终止。但这不是这里发生的事情。相反,PySide/PyQt脚本无论如何都会继续运行,许多人非常正确地认为这是一个bug(或者至少是一个错误特性)。在PyQt-5.5中,这种行为现在已经改变,因此
那么,我们应该怎么做呢?对于所有版本的PySide和PyQt,最好的解决方案是安装一个
exception hook
-因为它总是优先于默认行为(不管是什么)。信号、虚拟方法或其他python代码引发的任何未经处理的异常都将首先调用
在您的示例脚本中,这可能意味着添加以下内容:
现在由
|
![]() |
2
3
根据 Qt5 docs 您需要处理正在调用的插槽内的异常。
在第二种情况下,您通过
|
![]() |
3
0
谢谢你们的回答。我找到了
答案对于理解异常处理的位置以及利用的想法特别有用
我通过上下文管理器模拟了一个快速解决方案,以临时扩展当前
|
![]() |
4
0
考虑到信号/时隙架构提出了信号和时隙之间的松耦合交互,这种处理表达式的方法并不奇怪。这意味着信号不应期望插槽内发生任何事情。 timmwagener 的解决方案相当聪明,应该谨慎使用。问题可能不在于如何处理Qt连接之间的异常,而在于信号/插槽架构并不适合您的应用程序。此外,如果连接了来自不同线程的插槽或Qt,则该解决方案将不起作用。使用QueuedConnection。 解决插槽中出现错误的一个好方法是在连接处而不是发射处确定错误。然后可以以松散耦合的方式处理误差。
Qt5 docs ,表示您需要处理被调用插槽内的异常。
这只是一个基于用例的非常小的概述的建议。 解决这个问题没有正确/错误的方法 ,我只是想提出一个不同的观点:) |