pyqt 界面崩溃时,能否执行别的动作 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
HITMengbin
V2EX    Python

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

  •  
  •   HITMengbin 2020-12-04 15:53:23 +08:00 2870 次点击
    这是一个创建于 1774 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    @tanranran
    @Vegetable
    HITMengbin
        4
    HITMengbin  
    OP
       2020-12-04 16:27:33 +08:00
    @tanranran 我现在只是在每个查询端口那里加 try 判断,总感觉这样太不方便了
    HITMengbin
        5
    HITMengbin  
    OP
       2020-12-04 16:28:20 +08:00
    @Vegetable 好的,我看看,谢谢
    HITMengbin
        6
    HITMengbin  
    OP
       2020-12-04 16:29:27 +08:00
    @DoctorCat QT 本身有 event 判定,但是就是崩溃了,对事件判定不知道还能不能行
    gainsurier
        7
    gainsurier  
       2020-12-04 16:30:08 +08:00 via iPhone
    breakpad ?
    HITMengbin
        8
    HITMengbin  
    OP
       2020-12-04 16:34:26 +08:00
    @gainsurier 只是抓取崩溃报告吧
    wuwukai007
        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)
    andthen255
        10
    andthen255  
       2020-12-04 19:05:37 +08:00
    虽然我用的是 qt 不是 pyqt,崩溃了是主线程阻塞卡死了吧? exec 本质是一个循环一直拿事件队列里的事件处理,卡死就不会处理事件了,当然也不会执行什么功能。我都是开个线程处理 COM,每次操作的时候判断状态
    RealMadrid
        11
    RealMadrid  
       2020-12-04 20:04:00 +08:00
    如果是 qt 的话,qtcreator 源码中有一个 qtcrashhandler 的工具。当 qtcreator 崩溃时,会弹出一个窗口,打印奔溃的 back trace.
    具体实现原理,就是注册 sigaction, 当软件发生错误时,进入注册的函数。在函数里 fork 个进程,对原进程进行 gdb 分析,再启动另一个 dialog, 显示出来
    HITMengbin
        12
    HITMengbin  
    OP
       2020-12-08 11:38:41 +08:00
    @andthen255
    @RealMadrid
    @wuwukai007 谢谢各位,我多试试看,有结果反馈出来
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2901 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 14:28 PVG 22:28 LAX 07:28 JFK 10:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86