如何创建可统计触发次数的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
相关产品推荐
相关产品推荐

