問題描述
我正在嘗試使用 PyQt5 編寫一個在系統托盤中運行的應用程序.代碼有時會引發異常,我需要能夠捕獲它們.
I'm trying to write an app that works in system tray using PyQt5. The code is sometimes raising exceptions, and I need to be able to catch them.
我希望當應用程序中發生異常時,主事件循環會退出,所以像這樣捕獲它應該可以工作:
I would expect that when an exception occurs in an app, the main event loop is exited, so catching it like that should work:
try:
application.exec()
except:
do_stuff()
在下面的例子中,當我按下Raise"按鈕時,我只看到回溯,但我從來沒有看到 error catched!
打印出來.
In the following example, when I press the "Raise" button, I only see the traceback, but I never see the error catched!
printed.
from PyQt5 import QtWidgets, QtGui, QtCore
class ErrorApp():
def __init__(self):
# Init QApplication, QWidet and QMenu
self.app = QtWidgets.QApplication([])
self.widget = QtWidgets.QWidget()
self.menu = QtWidgets.QMenu("menu", self.widget)
# Add items to menu
self.menu_action_raise = self.menu.addAction("Raise")
self.menu_action_raise.triggered.connect(self.raise_error)
self.menu_action_exit = self.menu.addAction("Exit")
self.menu_action_exit.triggered.connect(self.app.exit)
# Create the tray app
self.tray = QtWidgets.QSystemTrayIcon(QtGui.QIcon("logo.png"), self.widget)
self.tray.setContextMenu(self.menu)
# Show app
self.tray.show()
def raise_error(self):
assert False
e = ErrorApp()
try:
e.app.exec()
except:
print("error catched!")
有 2 個類似的問題,但那里的答案沒有做我需要做的事情:
There are 2 similar questions, but the answers there don't do what I need to do:
抓取 PyQt 中的任何異常:OP 想要監控 異常,偶數循環不退出防止 PyQt 靜默插槽中發生的異常:裝飾器回答根本行不通;將 sys.exit(1)
添加到 sys.excepthook
只會關閉整個程序,而不會打印 error catched!
Grab any exception in PyQt: the OP wants to monitor the exceptions, the even loop isn't exited
Preventing PyQt to silence exceptions occurring in slots: the decorator answer simply doesn't work; adding sys.exit(1)
to sys.excepthook
just closes the whole program, without printing error catched!
推薦答案
你必須使用異常,如果你想要事件循環結束,那么你必須調用 quit()
(或 exit()
) 方法.
You must use the exception and, if you want the event loop to end then you must call the quit()
(or exit()
) method.
import sys
import traceback
from PyQt5 import QtWidgets, QtGui, QtCore
class ErrorApp:
# ...
def raise_error(self):
assert False
def excepthook(exc_type, exc_value, exc_tb):
tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
print("error catched!:")
print("error message:
", tb)
QtWidgets.QApplication.quit()
# or QtWidgets.QApplication.exit(0)
sys.excepthook = excepthook
e = ErrorApp()
ret = e.app.exec_()
print("event loop exited")
sys.exit(ret)
輸出:
error catched!:
error message:
Traceback (most recent call last):
File "main.py", line 28, in raise_error
assert False
AssertionError
event loop exited
這篇關于捕獲 QApplication 中引發的異常的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!