捕获 PyQt 中的任何异常

2023-12-08

我在 PyQt 中创建了一个 GUI 应用程序,我想与很多人分享。有时我会遇到意想不到的异常,并且我认为这是理所当然的 - 在每次异常之后我都会改进我的代码,并且它会变得越来越好。

我使用记录器来记录这些异常,并使用 PyQt 静默异常的特殊钩子。我的代码如下所示:

Logger

def setLogger(level=logging.DEBUG,
              name="my_logger",
              file=join("src", "log.out")):

    logger = logging.getLogger(name)
    logger.setLevel(level)

    # console logger
    ch = logging.StreamHandler()
    console_lvl = logging.DEBUG
    ch.setLevel(console_lvl)
    formatter = logging.Formatter('%(message)s')
    ch.setFormatter(formatter)

    #file logger    
    fh = logging.FileHandler(file)
    fh.setLevel(level)
    formatter = logging.Formatter(
        '%(asctime)s :: %(name)s - %(message)s',
        datefmt='%m/%d/%Y %I:%M:%S %p')
    fh.setFormatter(formatter)
    logger.addHandler(ch)
    logger.addHandler(fh)
    return logger

GUI中的2个典型类

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        self.logger = setLogger(name='main_window')
        [...]

class UploadDialog(QtGui.QDialog):

def __init__(self):
    self.logger = setLogger(name='upload_dialog')
    [...]

等等
PyQt 有其静默异常 - 发生异常但程序继续运行。我在这种情况下使用特殊的钩子(在某处看到过,这不是我的代码)

import sys
sys._excepthook = sys.excepthook

def exception_hook(exctype, value, traceback):
    sys._excepthook(exctype, value, traceback)
    sys.exit(1)

现在我想捕获任何异常,因此我的程序的用户在发生任何崩溃时可以将他们的信息发送给我log.out我会看到完整的日志。

我就是从这样的事情开始的。

try:
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
except Exception:
    logger.exception("MainWindow exception")

我工作得很好,直到内部出现异常上传对话框。没有任何内容被“记录”。所以我只是做了:

#inside MainWindow class
def runDialog(self):
    try:
        dialog = UploadDialog()
        dialog.exec_()
    except Exception:
        self.logger.exception("Dialog exception")
        sys.exit(1)

同样,一切正常,直到内部引发异常工作线程(继承自QThread类,用于后台上传)。然后再次。

#inside UploadDialog
def upload(self):
    # initialized as self.task = WorkThread()
    try:
        self.task.start()
    except Exception:
        self.logger.exception("Exception in WorkThread")

然后,不是在 WorkThread 启动后而是在初始化时引发了异常,所以

class UploadDialog(QtGui.QDialog):

    def __init__(self):
        try:
            self.task = WorkThread()
        except Exception:
            self.logger.exception("Exception in WorkThread")

在这里,我只是抬起头,对自己尖叫——“停下来。你做错了。这不是蟒蛇式的,它很脏,它让我的眼睛流血”。

所以,我问 - 是否有任何优雅且Pythonic的方法来捕获在PyQt应用程序中引发的绝对任何异常try...except block?


使用 excepthook 的目的是让你可以监控all程序引发的异常,并集中处理它们。

所以你应该摆脱其中的大部分try/except块,并在 excepthook 函数内记录异常。我说“大多数”,因为你可能会受到影响错误 1230540, where sys.excepthook在主线程之外没有正确调用。请参阅跟踪器线程以获取一些解决方法,或者这个答案.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获 PyQt 中的任何异常 的相关文章

  • 如何仅选择数组中的第一列并对其求和?

    这是我的代码 import numpy as np contrainte1 1080 0 65 minutes tous les jours contrainte2 720 0 55 minutes du lundi au vendredi
  • python blpapi安装错误

    我试图根据 README 中的说明为 python 安装 blpapi 3 5 5 但是在运行时 python setup py install 我收到以下错误 running install running build running b
  • groupby pandas数据框中连续相同的值和出现次数的累积计数

    我有一个问题 我想计算数据帧中当前值在滚动周期内未更改的次数 例如 df pd DataFrame col list aaaabbab 会以某种方式给出输出 0 1 2 3 0 1 0 0 我一直在尝试以下一些事情 df col df co
  • Colab 的使用限制持续多久?

    当我对同一帐户的两个笔记本同时使用两个 GPU 约半小时后 Colab 已 12 小时未运行 此消息不断弹出 由于 Colab 中的使用限制 您当前无法连接到 GPU 自从我上次使用 colab 以来已经过去了大约两个小时 但该消息仍然弹出
  • 如何在seaborn中绘制离散变量的分布图

    当我画画的时候displot对于离散变量 分布可能不像我想象的那样 例如 We can find that there are crevices in the barplot so that the curve in kdeplot is
  • 检查列表是否已排序的 Pythonic 方法

    有没有一种Python式的方法来检查列表是否已经排序ASC or DESC listtimestamps 1 2 3 5 6 7 就像是isttimestamps isSorted 返回True or False 我想输入一些消息的时间戳列
  • 如何不断地将 STDOUT 发送到我的 python TCP 服务器?

    我有简单的 python echo 服务器 它使用套接字 并向客户端回显随机数 我有另一个程序 每 2 秒将值打印到标准输出 如果它只是一个脚本 我可以像这样重定向 stdout python script py 并像这样在脚本中获取它da
  • 如何使用 numpy 从一维数组创建对角矩阵?

    我正在使用 Python 和 numpy 来做线性代数 我表演了numpy对矩阵进行 SVD 以获得矩阵 U i 和 V 然而 i 矩阵表示为 1 行的 1x4 矩阵 IE 12 22151125 4 92815942 2 06380839
  • 将带有 md5 消息摘要和 DESede/CBC/PKCS5Padding 的 3DES 加密的 java 代码转换为 python

    我有这个工作java代码 它使用3DES加密对密码进行加密 import java security MessageDigest import java util Arrays import java util Base64 import
  • 在 Qt 5 中嵌入 Python

    我想将 Python 解释器嵌入到 Qt 5 应用程序中 我在 Qt 5 中有一个工作应用程序 但是当我把 include
  • 使用 os.forkpty() 创建一个伪终端以 ssh 到远程服务器并与其通信

    我正在尝试编写一个 python 脚本 它可以 ssh 到远程服务器 并可以从 python 客户端执行 ls cd 等简单命令 但是 在成功 ssh 到服务器后 我无法读取伪终端的输出 任何人都可以在这里帮助我 以便我可以在服务器上执行一
  • 如何在python中访问矩阵每个元素的相邻单元格?

    这里 如果两个单元共享边界 则它们被认为是相邻的 例如 A 5 6 4 2 1 3 7 9 8 这里 索引 0 0 的相邻元素位于索引 0 1 和 1 0 处 索引 1 1 的相邻元素位于索引 0 1 1 0 2 1 处 和 1 2 假设你
  • Log4Net“找不到架构信息”消息

    我决定使用log4net http logging apache org log4net index html作为新 Web 服务项目的记录器 一切工作正常 但对于我在我的应用程序中使用的每个 log4net 标签 我都会收到很多类似下面的
  • 如何删除 pip 安装的所有软件包?

    如何从当前激活的虚拟环境中卸载 pip 安装的所有软件包 我发现这个片段作为替代解决方案 与重新创建 virtualenv 相比 删除库更加优雅 pip freeze xargs pip uninstall y 如果您通过 VCS 安装了软
  • 在 matplotlib 中将 3D 背景更改为黑色

    我在将 3D 图表的背景更改为黑色时遇到问题 这是我当前的代码 当我将facecolor设置为黑色时 它会将图表内部更改为灰色 这不是我想要的 fig plt figure fig set size inches 10 10 ax plt
  • 向结构化 numpy 数组添加字段

    将字段添加到结构化 numpy 数组的最简洁方法是什么 是否可以破坏性地完成 或者是否有必要创建一个新数组并复制现有字段 每个字段的内容是否连续存储在内存中 以便可以有效地完成此类复制 如果您使用 numpy 1 3 还有 numpy li
  • Django INSTALLED_APPS 的命名约定是如何工作的?

    该网站上的教程创建了一个名为 polls 的应用程序 它使用 django 1 9 所以在 INSTALLED APPS 中它是 polls apps PollsConfig 我正在观看一个教程 他将应用程序命名为新闻通讯 并且在 INST
  • Matplotlib:检查空图

    我有一个循环加载并绘制一些数据 如下所示 import os import numpy as np import matplotlib pyplot as plt for filename in filenames plt figure i
  • 如何从Python枚举类中获取所有值?

    我正在使用 Enum4 库创建一个枚举类 如下所示 class Color Enum RED 1 BLUE 2 我要打印 1 2 作为某处的列表 我怎样才能实现这个目标 您可以执行以下操作 e value for e in Color
  • 使用 python/scipy 进行 voronoi 和 lloyd 松弛

    如何使用 Qhull 确定哪些 voronoi 单元 按索引 是 正确的 由 现有顶点 组成 我正在尝试使用 LLoyds 算法和 scipy spatial Voronoi 它是 Qhull 的包装器 生成的输入来执行约束松弛 就代码而言

随机推荐