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

时间:2019-07-11 14:31:47

标签: python exception pyqt pyqt5 sys

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

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

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

我的问题是:

1)为什么需要这样做?我了解这是PyQt的一个已知问题,其中异常/错误消息“丢失”,程序容易崩溃。

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

sys._excepthook

1 个答案:

答案 0 :(得分:1)

如果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 

如果是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可以使用。