【问题标题】:How does the sys.excepthook function work with PyQt5? [duplicate]sys.excepthook 函数如何与 PyQt5 一起工作? [复制]
【发布时间】:2019-11-21 07:35:06
【问题描述】:

我正在开发一个使用 PyQt5 创建 GUI 的 Python 项目。我遇到了错误不会终止程序或发送错误消息的问题;该程序会崩溃。在进行一些研究时,我能够在 Reddit 上找到我添加到我的 __init__ 方法中的一段代码。这解决了我的问题,但不幸的是,帖子并没有详细说明解决方案,所以我不确定为什么会这样。

在阅读 Python 文档时,我了解到 sys.excepthook 函数本质上是获取异常,并将其打印到控制台,这是正确的吗?

看起来这段代码正在从sys.excepthook获取异常并将其存储在变量sys._excepthook中,然后定义函数exception_hook,该函数本质上调用sys.excepthook(通过sys._excepthook)。

我的问题是:

1) 为什么需要这个?我知道这是 PyQt 的一个已知问题,异常/错误消息会“丢失”并且程序往往会崩溃。

2) 这段代码是如何解决问题的?

sys._excepthook = sys.excepthook

def exception_hook(exctype, value, traceback):
    print(exctype, value, traceback)
    sys._excepthook(exctype, value, traceback)
    sys.exit(1)

sys.excepthook = exception_hook

【问题讨论】:

    标签: python exception pyqt pyqt5 sys


    【解决方案1】:

    如果在try: .... except 之外发生异常,则调用sys.excepthook 函数。因此,如果您想按自己的方式管理它,您需要编写自己的函数。

    在我的应用程序中,我没有遇到丢失错误信息的问题,但这种异常不会终止应用程序。

    sys._excepthook = sys.excepthook # save original excepthook 
    
    def exception_hook(exctype, value, traceback):
        print(exctype, value, traceback) # print exception. 
        sys._excepthook(exctype, value, traceback) # call original excepthoot. I do not why 
        sys.exit(1) # terminate program if above do not do this
    
    sys.excepthook = exception_hook # overwrite default excepthook 
    

    如果是python 3我建议改一下:

    import traceback
    import sys 
    
    
    def def exception_hook(exctype, value, traceback):
        traceback_formated = traceback.format_exception(exctype, value, traceback)
        traceback_string = "".join(traceback_formated)
        print(traceback_string, file=sys.stderr)
        sys.exit(1)
    

    还有sys.__excepthook__docs可以使用。

    【讨论】:

    • 我尝试编辑此内容,然后意识到我需要更改很多内容...所以我尝试回滚到您的原始内容...请拒绝我的编辑,因为我是添加我自己的答案(基于你的)
    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多