首页 > 解决方案 > 异常子类中的 Python logging.exception(即继承自 Exception 的 CustomError 类)

问题描述

每当我提出自定义 Exception 类时,我都会尝试使用 python 的内置日志记录模块“自动”记录异常信息,这样我就不必每次都编写 logger.exception(exception_message) 来获取 exception_info ( sys.exc_info) 在日志中正确部分,而不是 NoneType: None。

使用以下代码,每当出现 logger.exception 行而不是适当的 sys.exc_info 时,我都会得到“NoneType:None”。

import logging

logger = logging.getLogger('exceptions_module')

class CustomError(Exception):
    def __init__(self, error_msg):
        super().__init__(error_msg)
        logger.exception(error_msg)

def forced_exception():
    try:
        raise Exception('some_exceptionh_occured')
    except Exception as error_msg:
        # Do some clean-up or other exception handling operations
        # ...

        # Now raise the exception as a custom error
        raise CustomError(error_msg)

有时将低级异常重写为“更易于阅读”和用户友好的错误消息是非常有益的。(这是这里的主要用例)

那么有什么方法不会让我写 3 行:

# [...]
    except Exception as error_msg:
        new_custom_error_msg = 'User-friendly message for:' + error_msg
        logger.exception(new_custom_error_msg)
        raise CustomError(new_custom_error_msg)

想到了另一种选择,但仍然“迫使”我为每个引发的异常付出额外的努力,那就是每次都明确传递“正确的” sys.exc_info()

from sys import exc_info as exception_info
# [...]
class CustomError(Exception):
    def __init__(self, error_msg, exc_info):
        super().__init__(error_msg)
        logger.exception(error_msg, exc_info=exc_info)
# [...]
    except Exception as error_msg:
        raise CustomError(new_custom_error_msg, exception_info())

每次我需要引发 CustomError时,我都非常倾向于明确添加“exception_info” ......

有什么建议可以使这个更精简并避免不必要的代码重复吗?

标签: pythonexceptionlogging

解决方案


推荐阅读