<tfoot id='cuBRa'></tfoot>
      <bdo id='cuBRa'></bdo><ul id='cuBRa'></ul>
  • <i id='cuBRa'><tr id='cuBRa'><dt id='cuBRa'><q id='cuBRa'><span id='cuBRa'><b id='cuBRa'><form id='cuBRa'><ins id='cuBRa'></ins><ul id='cuBRa'></ul><sub id='cuBRa'></sub></form><legend id='cuBRa'></legend><bdo id='cuBRa'><pre id='cuBRa'><center id='cuBRa'></center></pre></bdo></b><th id='cuBRa'></th></span></q></dt></tr></i><div id='cuBRa'><tfoot id='cuBRa'></tfoot><dl id='cuBRa'><fieldset id='cuBRa'></fieldset></dl></div>

        <legend id='cuBRa'><style id='cuBRa'><dir id='cuBRa'><q id='cuBRa'></q></dir></style></legend>

      1. <small id='cuBRa'></small><noframes id='cuBRa'>

        捕获 QApplication 中引发的异常

        时间:2023-08-05

            <bdo id='B8KmE'></bdo><ul id='B8KmE'></ul>

              <small id='B8KmE'></small><noframes id='B8KmE'>

                  <tfoot id='B8KmE'></tfoot>
                  <i id='B8KmE'><tr id='B8KmE'><dt id='B8KmE'><q id='B8KmE'><span id='B8KmE'><b id='B8KmE'><form id='B8KmE'><ins id='B8KmE'></ins><ul id='B8KmE'></ul><sub id='B8KmE'></sub></form><legend id='B8KmE'></legend><bdo id='B8KmE'><pre id='B8KmE'><center id='B8KmE'></center></pre></bdo></b><th id='B8KmE'></th></span></q></dt></tr></i><div id='B8KmE'><tfoot id='B8KmE'></tfoot><dl id='B8KmE'><fieldset id='B8KmE'></fieldset></dl></div>

                    <tbody id='B8KmE'></tbody>

                • <legend id='B8KmE'><style id='B8KmE'><dir id='B8KmE'><q id='B8KmE'></q></dir></style></legend>
                  本文介绍了捕获 QApplication 中引发的异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我正在尝试使用 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模板网!

                  上一篇:如何使用 PyQt 更改光标形状? 下一篇:AttributeError:模块“PyQt5.QtGui"没有属性“QWidg

                  相关文章

                  最新文章

                  <legend id='ArsSn'><style id='ArsSn'><dir id='ArsSn'><q id='ArsSn'></q></dir></style></legend>
                • <small id='ArsSn'></small><noframes id='ArsSn'>

                  <i id='ArsSn'><tr id='ArsSn'><dt id='ArsSn'><q id='ArsSn'><span id='ArsSn'><b id='ArsSn'><form id='ArsSn'><ins id='ArsSn'></ins><ul id='ArsSn'></ul><sub id='ArsSn'></sub></form><legend id='ArsSn'></legend><bdo id='ArsSn'><pre id='ArsSn'><center id='ArsSn'></center></pre></bdo></b><th id='ArsSn'></th></span></q></dt></tr></i><div id='ArsSn'><tfoot id='ArsSn'></tfoot><dl id='ArsSn'><fieldset id='ArsSn'></fieldset></dl></div>

                      • <bdo id='ArsSn'></bdo><ul id='ArsSn'></ul>
                    1. <tfoot id='ArsSn'></tfoot>