具有功能的自定义例外

时间:2018-11-11 09:50:38

标签: python python-3.x

我遇到了一个非常标准的问题,想知道我的解决方案是否正确。

每次发生异常我希望它被呼叫者捕获并记录,然后重新引发。

由于我不想每次都重复记录消息,因此我创建了一个自定义异常,该异常可以保存消息数据并记录日志。

class LoggingException(Exception):
    def __init__(self, message, package_id):
        # Get caller informat
        caller = getframeinfo(stack()[2][0])
        self.filename = caller.filename
        self.function = caller.function

        # Set message info and log
        self.message = message
        if (LogManager.log_handler is None):
            print(message)
        else:
            LogManager.l(package_id, LogLevelEnum.ERROR, message)

用例:

def main_func():
    try:
        secondary_func()
    except Exception as ex:
        raise LoggingException("Some log") from ex

def secondary_func():
    raise LoggingException("Exception info")

问题是不能完全确定是否有例外可以执行任何操作,这对于它没有标准的python解决方案来说是普遍的。

注意:由于产品的限制,我没有使用python日志记录模块。

1 个答案:

答案 0 :(得分:2)

试图获得类似这样的呼叫者信息将是不可靠的。另外,在某些情况下,您可能不是直接呼叫者。

异常日志记录本身的想法似乎很明智。为了妥协,我会将日志记录功能移到可以显式触发的单独方法中。毕竟,例外是大多数常规对象:

class LoggingException(Exception):
    def __init__(self, message, package_id):
        # Set message info
        super.__init__(message)
        self.package_id = package_id

    def log(self, manager=None):
        if manager.log_handler is None:
            print(super().__str__())
        else:
            manager.l(self.package_id, LogLevelEnum.ERROR, super()..__str__())

现在,您可以随时触发记录操作,而不必重建消息:

try:
    ...
except LoggingException as e:
    e.log(some_manager)
    raise

这使您可以选择重新引发错误(如此处所示),或像示例中那样将其链接。除非您有充分的理由这样做,否则我强烈建议您不要使用链接。