为了账号安全,请及时绑定邮箱和手机立即绑定

具有功能的自定义异常

具有功能的自定义异常

潇潇雨雨 2021-08-14 17:47:36
我遇到了一个非常标准的问题,想知道我的解决方案是否正确。每次发生异常时,我都希望它被调用者捕获并记录下来,然后重新引发。由于我不想每次都重复记录消息,所以我创建了一个自定义异常来保存消息数据和日志。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 exdef secondary_func():    raise LoggingException("Exception info")问题是我不完全确定有异常做任何操作是个好主意,这是通用的,因为它没有标准的 python 解决方案。注意:由于产品限制,我没有使用 python 日志记录模块。
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超22个赞

试图获取这样的来电者信息是不可靠的。此外,在某些情况下,您并不感兴趣的直接来电者。


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


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

这使您可以选择真正重新引发错误,如此处所示,或者像示例中那样链接它。我强烈建议不要链接,除非你有很好的理由这样做。

查看完整回答
反对 回复 2021-08-14
  • 1 回答
  • 0 关注
  • 250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号