【发布时间】:2021-08-16 00:39:12
【问题描述】:
在 Python 3 中有没有办法在日志记录期间引发异常?我的意思是,我可以以某种方式配置标准logging 模块以在logging.error(e) 完成时引发异常吗?
【问题讨论】:
在 Python 3 中有没有办法在日志记录期间引发异常?我的意思是,我可以以某种方式配置标准logging 模块以在logging.error(e) 完成时引发异常吗?
【问题讨论】:
是的,你可以用自己的方法替换方法。
import logging
def except_only(msg, *args, **kwargs):
raise Exception(msg)
logging.error = except_only # do not use () here!
logging.error("Log an error")
问题:如果要记录+异常,则需要记住原始方法。
import logging
old_logging_error = logging.error # do not use () here!
def new_logging_error(msg, *args, **kwargs):
global old_logging_error
old_logging_error(msg, *args, **kwargs)
raise Exception(msg)
logging.error = new_logging_error # do not use () here!
logging.error("Log an error")
【讨论】:
您通常不会通过调用logging.error(e) 记录错误。你通常打电话
logging.error('my message', exc_info=True)
或
logging.error('my message', exc_info=e) # Where e is the exception object
话虽如此,您可以扩展 Logger 类来执行此操作:
from logging import Logger, setLoggerClass
from sys import exc_info
class ErrLogger(Logger):
def error(msg, *args, **kwargs):
super().error(msg, *args, **kwargs)
err = kwargs.get('exc_info')
if not isintsance(err, Exception):
_, err, _ = exc_info()
if err is None:
err = SomeDefaultError(msg) # You decide what to raise
raise err
现在使用setLoggerClass 函数注册新类:
setLoggerClass(ErrLogger)
使用自定义error 设置自定义记录器可能比覆盖模块级别error 更可靠,后者仅在根记录器上运行。
此处显示的方法将按以下顺序引发错误:
exc_info 仅关键字参数传递的错误。SomeDefaultError 您指定的。如果您想放弃此过程,请将 super().error(msg, *args, **kwargs) 之后的所有内容替换为 raise SomeDefaultError(...)。
【讨论】:
raise MyError(...)。