python – PyQt5中未处理的异常
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – PyQt5中未处理的异常,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1789字,纯文字阅读大概需要3分钟。
内容图文
![python – PyQt5中未处理的异常](/upload/InfoBanner/zyjiaocheng/781/4c1204971e31414ca62af25155321b15.jpg)
看看下面的MWE.
import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.button = QPushButton('Bham!')
self.setCentralWidget(self.button)
self.button.clicked.connect(self.btnClicked)
def btnClicked(self):
print(sys.excepthook)
raise Exception
#import traceback
#sys.excepthook = traceback.print_exception
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
app.exec_()
我有很多问题.我不知道他们是否都是相关的(我猜是这样),所以请原谅我,如果不是.
>当我从终端运行上面的代码时,一切都很好.该程序运行,如果我点击按钮它会打印回溯并死掉.如果我在IDE中运行它(我测试了Spyder和PyCharm),则不会显示回溯.知道为什么吗?在SO,here和here上的其他帖子中也提出了同样的问题.请不要将此标记为其中任何一个的副本;请继续阅读.
>通过添加注释行,可以再次正确显示回溯.但是,他们也有令人讨厌的副作用,应用程序不再终止未处理的异常!我不知道为什么会这样,因为AFAIK excepthook只打印回溯,它不能阻止程序退出.在被召唤的那一刻,救援已经太晚了.
>另外,我不明白Qt是如何在这里发挥作用的,因为未插入插槽内的异常仍会像我期望的那样使应用程序崩溃.无论我是否改变异常,PyQt似乎也不会覆盖它(至少印刷品似乎暗示如此).
仅供参考,我使用Python 3.5和PyQt 5.6,我知道PyQt 5.5中引入的异常处理的变化.如果这些确实是上述行为的原因,我会很高兴听到一些更详细的解释.
解决方法:
当Qt插槽内发生异常时,它是调用Python代码的C.由于Qt / C对Python异常一无所知,因此您只有两种可能性:
>打印异常并将一些默认值返回到C(如0,“”或NULL),可能会出现意外的副作用.这就是PyQt< 5.5呢.
>打印例外,然后调用qFatal()或abort(),使应用程序立即退出C内部.这就是PyQt> = 5.5的作用,除非你有自定义的excepthook集.
Python仍然没有终止的原因可能是因为它不能,因为它在一些C代码中.你的IDE没有显示堆栈的原因可能是因为它没有正确处理abort() – 我建议打开一个针对IDE的错误.
内容总结
以上是互联网集市为您收集整理的python – PyQt5中未处理的异常全部内容,希望文章能够帮你解决python – PyQt5中未处理的异常所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。