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可以用
我正在开发一个 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可以用