You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可统计触发次数的Error子类,控制错误触发频率?

自定义带触发次数统计的异常子类

嘿,这个需求其实用Python的类变量就能很优雅地解决,既符合规范又好维护,我之前做监控脚本的时候就用过类似的思路!

核心思路是用类变量来维护全局的触发计数——因为类变量会被该异常的所有实例共享,完美适配统计总触发次数的场景。下面是具体实现:

完整示例代码

from random import randint

class TrackedZeroDivisionError(ZeroDivisionError):
    # 类变量:统计该异常的总触发次数
    trigger_count = 0

    def __init__(self, *args, **kwargs):
        # 每次抛出异常(实例化对象)时,计数自动+1
        TrackedZeroDivisionError.trigger_count += 1
        # 调用父类的初始化逻辑,保留原异常的所有原生行为
        super().__init__(*args, **kwargs)

# 测试你的场景
if __name__ == "__main__":
    try:
        for i in range(100):
            divisor = randint(0, 10)
            if divisor == 0:
                # 抛出我们自定义的异常
                raise TrackedZeroDivisionError(f"第{i+1}次触发,除数为{divisor}")
            print(f"1/{divisor} = {1/divisor}")
    except TrackedZeroDivisionError as e:
        print(f"\n捕获到异常: {e}")
        print(f"截至目前,该异常总共触发了 {TrackedZeroDivisionError.trigger_count} 次")

关键细节拆解

  • 类变量的选择:用trigger_count类变量而不是实例变量,确保所有该异常的实例共享同一个计数器,不管在代码哪个位置抛出,计数都会正确累加。
  • 兼容原生异常:继承自ZeroDivisionError,意味着它既可以被原有的except ZeroDivisionError块捕获,也可以单独捕获,完全不影响原有代码的异常处理逻辑。
  • 自动计数:重写__init__方法,在异常对象创建时自动增加计数,不需要手动调用额外的统计函数,符合Python异常的使用习惯。

进阶优化:重置计数

如果需要重置计数,可以给类添加一个类方法:

@classmethod
def reset_trigger_count(cls):
    cls.trigger_count = 0

使用时直接调用TrackedZeroDivisionError.reset_trigger_count()就能清零计数器,非常方便。

通用扩展

这个模式可以直接复制到任何异常类上,比如要统计ValueError的触发次数,只需要把父类换成ValueError,逻辑完全一致,复用性极强。

内容的提问来源于stack exchange,提问作者cardamom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:23:28