我似乎无法弄清楚这一点,这似乎是我应该能够做的事情,但我很愚蠢,所以请帮助我上网。
我想要有一个超类,它需要它的继承者实现一个方法,但最终有通用的错误处理,即记录错误并引发错误。我更喜欢这种方法,因为我有一堆使用这个对象的子类,所以更新父类的代码更改要少得多,而且与向我拥有的每种风格添加 try/catch 相比,看起来也更干净。
例如
childClass
我已经实现了类似上面的东西,但我没有看到正在创建的日志消息
当然,您看不到任何日志:当您定义“childClass.mymethod()”时,相应的“Super.mymethod()”将被覆盖并且从未被调用。这就是继承的工作原理。
扩展
childClass
而是提供其实现。如果您选择使用继承,请按照 juanpa.arrivilillaga 的建议进行操作,并重写执行 Super
实际工作的私有方法。
my_method
或者,如果 class Super:
logger = logging.GetLogger(__name__)
def my_method(self, some_value):
try:
self._my_method(some_value)
except Exception as e:
logger.error("error raised: %s" % e)
raise e
def _my_method(self, some_value):
raise NotImplementedError("_my_method must be implemented")
class childClass(Super):
def _my_method(self, some_value):
...
仅为任意代码提供日志记录上下文,并让它提供上下文管理器而不是使用继承。
Super
class LoggingContext:
logger = logging.GetLogger(__name__)
def __enter__(self):
pass
def __exit__(self, exc=None, *args):
if exc is not None:
self.logger.error("error raised: %s", exc)
class Child:
def my_method(self, some_value):
...
c = Child()
with LoggingContext():
c.my_method(foo)
语句“捕获”由with
引发的任何异常并将其传递给
Child.my_method
,
__exit__
将记录该异常,并且通过不返回
True
,让
with
语句自动重新引发错误。