pyqt 界面崩溃时,能否执行别的动作

2020-12-04 15:53:23 +08:00
 HITMengbin

请教各位,因为需要连接一个 com 口读取信息,com 口经常消失,导致 pyqt 的界面存在崩溃的情况,想添加一个功能,在程序出现问题,界面准备崩溃的时候,会执行这个功能,请问这个想法可以实现吗?如何实现呢?

2433 次点击
所在节点    Python
12 条回复
tanranran
2020-12-04 15:57:47 +08:00
sys.excepthook
Vegetable
2020-12-04 15:59:55 +08:00
https://docs.python.org/zh-cn/3/library/atexit.html
也许能解决你的问题,这个模块可以注册函数,在程序退出之前自动执行。你描述的场景应该属于一般的 error,在射程之内。
DoctorCat
2020-12-04 16:03:56 +08:00
崩溃了怕是不行,Qt native 库是非托管的,已经进入系统管辖的异常链了。Python VM 层面无法 catch 到的。Qt 的动态库里看看有没有什么方法能捕获。

@tanranran
@Vegetable
HITMengbin
2020-12-04 16:27:33 +08:00
@tanranran 我现在只是在每个查询端口那里加 try 判断,总感觉这样太不方便了
HITMengbin
2020-12-04 16:28:20 +08:00
@Vegetable 好的,我看看,谢谢
HITMengbin
2020-12-04 16:29:27 +08:00
@DoctorCat QT 本身有 event 判定,但是就是崩溃了,对事件判定不知道还能不能行
gainsurier
2020-12-04 16:30:08 +08:00
breakpad ?
HITMengbin
2020-12-04 16:34:26 +08:00
@gainsurier 只是抓取崩溃报告吧
wuwukai007
2020-12-04 17:54:15 +08:00
def excepthook(exc_type, exc_value, exc_tb):
tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
logging.info("error message:\n%s", tb)
# QtWidgets.QApplication.quit()

sys.excepthook = excepthook
ret = app.exec_()
sys.exit(ret)
andthen255
2020-12-04 19:05:37 +08:00
虽然我用的是 qt 不是 pyqt,崩溃了是主线程阻塞卡死了吧? exec 本质是一个循环一直拿事件队列里的事件处理,卡死就不会处理事件了,当然也不会执行什么功能。我都是开个线程处理 COM,每次操作的时候判断状态
RealMadrid
2020-12-04 20:04:00 +08:00
如果是 qt 的话,qtcreator 源码中有一个 qtcrashhandler 的工具。当 qtcreator 崩溃时,会弹出一个窗口,打印奔溃的 back trace.
具体实现原理,就是注册 sigaction, 当软件发生错误时,进入注册的函数。在函数里 fork 个进程,对原进程进行 gdb 分析,再启动另一个 dialog, 显示出来
HITMengbin
2020-12-08 11:38:41 +08:00
@andthen255
@RealMadrid
@wuwukai007 谢谢各位,我多试试看,有结果反馈出来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/732153

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX