sys.excepthook 函数如何与 PyQt5 一起使用?

How does the sys.excepthook function work with PyQt5?

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

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

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

我的问题是:

1) 为什么需要这个?我知道这是 PyQt 的一个已知问题,其中 exceptions/error 消息收到 "lost" 并且程序往往会崩溃。

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

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

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

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 

如果python3我建议改成:

import traceback
import sys 


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可以用