Python父类用try/catch统一异常处理,子类重写方法无日志输出问题
父类通用异常处理日志未生成的问题解决
我希望实现这样的需求:父类定义需子类实现的method,同时通过try/catch完成通用异常处理(记录日志后抛出异常),这样无需给每个子类重复编写异常处理代码。但按示例代码实现后,未生成日志,请求帮助解决。
示例代码
import logging class Super(object): logger = logging.getLogger(__name__) def my_method(some_value): try: raise RuntimeError("my_method must be implemented") except Exception as e: logger.error("error raised: %s" % e) raise e class childClass(Super): def my_method(some_value): # do some stuff, maybe an error gets raised pass
问题分析
你的代码存在几个关键问题导致日志无法生成:
- 实例方法缺少
self参数:父类的my_method是实例方法,但未声明self参数,调用时会直接触发参数不匹配错误,根本走不到日志逻辑。 - 子类完全覆盖父类方法:子类重写
my_method后,父类中包含异常处理的代码逻辑完全不会被执行,通用异常处理的设计初衷完全失效。 - Logger引用错误:实例方法中直接使用
logger会触发变量未定义错误,需通过self.logger或Super.logger引用类属性。 - 未配置Logging基础环境:如果未调用
logging.basicConfig()配置日志级别、输出格式等基础参数,即使调用logger.error也不会有日志输出。
正确实现方案
采用模板方法模式结合abc模块实现需求:父类定义包含通用异常处理的模板方法,子类仅实现具体业务逻辑,同时强制子类必须实现指定方法,避免遗漏。
import logging from abc import ABC, abstractmethod # 配置Logging基础设置,确保日志正常输出 logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') class Super(ABC): logger = logging.getLogger(__name__) def my_method(self, some_value): try: # 调用子类必须实现的业务逻辑方法 self._do_business(some_value) except Exception as e: self.logger.error(f"error raised: {str(e)}") # 重新抛出异常,不阻断上层业务逻辑 raise @abstractmethod def _do_business(self, some_value): # 抽象方法,强制子类必须实现,否则无法实例化 pass class ChildClass(Super): def _do_business(self, some_value): # 子类实现具体业务逻辑,此处模拟异常场景 if some_value < 0: raise ValueError("some_value不能为负数") print(f"成功处理值:{some_value}") # 测试代码 if __name__ == "__main__": try: obj = ChildClass() obj.my_method(-1) except Exception as e: print(f"上层捕获异常:{str(e)}")
方案说明
- 父类继承
ABC并使用@abstractmethod定义抽象方法_do_business,确保子类不实现该方法就无法实例化,避免遗漏业务逻辑。 - 父类的
my_method作为模板方法,封装了通用的异常捕获、日志记录逻辑,所有子类都会复用这部分代码。 - 修正了实例方法的
self参数问题,正确通过self.logger访问类属性。 - 添加了
logging.basicConfig配置,保证日志能正常输出到控制台。
内容的提问来源于stack exchange,提问作者nate robo
相关产品推荐
相关产品推荐

