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