Python 捕获QApplication中引发的异常

Python 捕获QApplication中引发的异常,python,exception,pyqt,pyqt5,Python,Exception,Pyqt,Pyqt5,我正在尝试使用PyQt5编写一个在系统托盘中工作的应用程序。 代码有时会引发异常,我需要能够捕获它们 我认为,当应用程序中发生异常时,主事件循环将退出,因此像这样捕获它应该可以工作: 试试看: application.exec() 除: 做某事 在下面的示例中,当我按下“Raise”按钮时,我只看到回溯,但从未看到捕获的错误打印 从PyQt5导入QtWidgets、QtGui、QtCore 类ErrorApp(): 定义初始化(自): #初始化QApplication、QWidet和QMenu

我正在尝试使用PyQt5编写一个在系统托盘中工作的应用程序。 代码有时会引发异常,我需要能够捕获它们

我认为,当应用程序中发生异常时,主事件循环将退出,因此像这样捕获它应该可以工作:

试试看:
application.exec()
除:
做某事
在下面的示例中,当我按下“Raise”按钮时,我只看到回溯,但从未看到捕获的
错误打印

从PyQt5导入QtWidgets、QtGui、QtCore
类ErrorApp():
定义初始化(自):
#初始化QApplication、QWidet和QMenu
self.app=QtWidgets.QApplication([])
self.widget=qtwidts.QWidget()
self.menu=qtwidts.QMenu(“菜单”,self.widget)
#将项目添加到菜单
self.menu\u action\u raise=self.menu.addAction(“raise”)
self.menu\u action\u raise.triggered.connect(self.raise\u错误)
self.menu\u action\u exit=self.menu.addAction(“exit”)
self.menu\u action\u exit.triggered.connect(self.app.exit)
#创建托盘应用程序
self.tray=qtwidts.QSystemTrayIcon(QtGui.QIcon(“logo.png”),self.widget)
self.tray.setContextMenu(self.menu)
#显示应用程序
self.tray.show()
def raise_错误(自身):
断言错误
e=ErrorApp()
尝试:
e、 app.exec()
除:
打印(“捕获错误!”)
有两个类似的问题,但答案不符合我的要求:

:OP想要监视异常,偶数循环未退出
:装饰师的回答根本不起作用;将
sys.exit(1)
添加到
sys.excepthook
只会关闭整个程序,而不会打印
错误捕获

必须使用异常,如果希望事件循环结束,则必须调用
quit()
(或
exit()
)方法

导入系统 导入回溯 从PyQt5导入QtWidgets、QtGui、QtCore 类错误应用程序: # ... def raise_错误(自身): 断言错误 def例外挂钩(exc_类型、exc_值、exc_tb): tb=”“.join(回溯格式异常(exc\U类型、exc\U值、exc\U tb)) 打印(“捕获错误!:”) 打印(“错误消息:\n”,tb) qtwidts.QApplication.quit() #或qtwidts.QApplication.exit(0) sys.excepthook=excepthook e=ErrorApp() ret=e.app.exec 打印(“事件循环已退出”) 系统退出(ret)
输出:

error catched!:
error message:
 Traceback (most recent call last):
  File "main.py", line 28, in raise_error
    assert False
AssertionError

event loop exited

哦,我明白了-我必须在excepthook中处理它,而不是我的尝试。谢谢:)正常的
sys.\uuuuuu异常钩子(exc_类型,exc_值,exc_tb)
函数应该在execpthook函数结束时调用吗?