如何在回调函数中动态捕获指定异常?
如何通过回调函数动态捕获指定异常列表?
我正在编写一个基础日志工具,希望通过回调函数来动态捕获指定的异常列表并记录日志。尝试了两种写法都无效:
第一种是错误地在try-except里嵌套for循环,语法根本不成立:
def Except(self, func, exceptions, *args, **kwargs): """Used for logging exceptions""" try: func(*args, **kwargs) for exception in exceptions: # Obviously this doesn't work. except exception as e: self.log(f"{e}", "error", 4)
第二种尝试用解包的方式传递异常列表,但同样不生效:
def Except(self, func, exceptions, *args, **kwargs): """Used for logging exceptions""" try: func(*args, **kwargs) except (*exceptions) as e: self.log(f"{e}", "error", 4)
解决方案
其实Python的except语句本身就支持直接接收异常类的元组,不需要额外的解包操作。只要确保传入的exceptions是元组类型(如果是单个异常或列表,提前转成元组即可),就能实现动态捕获指定异常的需求。
修正后的代码如下:
def Except(self, func, exceptions, *args, **kwargs): """用于记录异常日志""" # 兼容单个异常的情况,统一转成元组 if not isinstance(exceptions, tuple): exceptions = (exceptions,) try: # 别忘了返回被回调函数的执行结果(如果需要的话) return func(*args, **kwargs) except exceptions as e: self.log(f"{e}", "error", 4)
为什么之前的写法不行?
- 第一种写法属于语法错误:Python的
try-except结构不允许在try块和except块之间插入循环语句,语法上完全不成立。 - 第二种写法的问题在于,
except语句的语法规则不支持用*解包的方式传递异常集合,只能直接传入异常类或异常类的元组。
内容的提问来源于stack exchange,提问作者nigel239
相关产品推荐
相关产品推荐

