超类中的Python try/catch用于错误处理,逻辑处理/子类方法中引发的错误

问题描述 投票:0回答:2

我似乎无法弄清楚这一点,这似乎是我应该能够做的事情,但我很愚蠢,所以请帮助我上网。

我想要有一个超类,它需要它的继承者实现一个方法,但最终有通用的错误处理,即记录错误并引发错误。我更喜欢这种方法,因为我有一堆使用这个对象的子类,所以更新父类的代码更改要少得多,而且与向我拥有的每种风格添加 try/catch 相比,看起来也更干净。

例如

childClass

我已经实现了类似上面的东西,但我没有看到正在创建的日志消息
    

当然,您看不到任何日志:当您定义“childClass.mymethod()”时,相应的“Super.mymethod()”将被覆盖并且从未被调用。这就是继承的工作原理。
python class inheritance
2个回答
0
投票
您可能想要类似

日志装饰器

之类的东西


0
投票
并不是

扩展

 
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
语句自动重新引发错误。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.