关于python:具有功能的自定义异常

Custom exception with functionality

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

使用案例:

1
2
3
4
5
6
7
8
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
2
3
4
5
6
7
8
9
10
11
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__())

现在,您可以随时触发日志记录操作,而无需重新构建消息:

1
2
3
4
5
try:
    ...
except LoggingException as e:
    e.log(some_manager)
    raise

这使您可以选择真正重新引发错误,如此处所示,或者将其链接到示例中。 我强烈建议不要使用链接,除非你有充分的理由去做。