请教各位,因为需要连接一个 com 口读取信息,com 口经常消失,导致 pyqt 的界面存在崩溃的情况,想添加一个功能,在程序出现问题,界面准备崩溃的时候,会执行这个功能,请问这个想法可以实现吗?如何实现呢?
1
tanranran 2020-12-04 15:57:47 +08:00
sys.excepthook
|
2
Vegetable 2020-12-04 15:59:55 +08:00
https://docs.python.org/zh-cn/3/library/atexit.html
也许能解决你的问题,这个模块可以注册函数,在程序退出之前自动执行。你描述的场景应该属于一般的 error,在射程之内。 |
3
DoctorCat 2020-12-04 16:03:56 +08:00 1
|
4
HITMengbin OP @tanranran 我现在只是在每个查询端口那里加 try 判断,总感觉这样太不方便了
|
5
HITMengbin OP @Vegetable 好的,我看看,谢谢
|
6
HITMengbin OP @DoctorCat QT 本身有 event 判定,但是就是崩溃了,对事件判定不知道还能不能行
|
7
gainsurier 2020-12-04 16:30:08 +08:00 via iPhone
breakpad ?
|
8
HITMengbin OP @gainsurier 只是抓取崩溃报告吧
|
9
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) |
10
andthen255 2020-12-04 19:05:37 +08:00
虽然我用的是 qt 不是 pyqt,崩溃了是主线程阻塞卡死了吧? exec 本质是一个循环一直拿事件队列里的事件处理,卡死就不会处理事件了,当然也不会执行什么功能。我都是开个线程处理 COM,每次操作的时候判断状态
|
11
RealMadrid 2020-12-04 20:04:00 +08:00
如果是 qt 的话,qtcreator 源码中有一个 qtcrashhandler 的工具。当 qtcreator 崩溃时,会弹出一个窗口,打印奔溃的 back trace.
具体实现原理,就是注册 sigaction, 当软件发生错误时,进入注册的函数。在函数里 fork 个进程,对原进程进行 gdb 分析,再启动另一个 dialog, 显示出来 |
12
HITMengbin OP |