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