请教各位,因为需要连接一个 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 ![]() 崩溃了怕是不行,Qt native 库是非托管的,已经进入系统管辖的异常链了。Python VM 层面无法 catch 到的。Qt 的动态库里看看有没有什么方法能捕获。 @ @Vegetable |
![]() | 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 |