是否应该在except块内调用logger.exception?为什么?

wim*_*wim 4 python logging exception python-2.7

logger.exception提及的文件:

只应从异常处理程序调用此方法.

因此用法应如下所示:

try:
    errorerrorerror
except NameError as e:
    logger.exception('debug message %s', e)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试以"错误"方式进行时,行为似乎是一样的:

try:
    errorerrorerror
except NameError as e:
    pass

logger.exception('debug message %s', e)
Run Code Online (Sandbox Code Playgroud)

在文档中提到这个警告的原因是什么?难道真的,我们只能用它在拦网除外,对于一些微妙的原因,这里没有明显的?

Mar*_*ers 6

该方法旨在用于异常处理程序.因此,文档告诉你,通过使用单词should,not must.

在标准文本中,应该而且必须严格定义; 一个意味着我们建议你这样做,如果你这样做会好得多,另一个意味着如果你不这样做,这是一个彻头彻尾的错误.有关IETF任务组的措辞,请参阅RFC 2119.

所有logging.exception()操作都是exc_info在调用之前设置关键字参数logging.error().exc_info然后,该论证将被充实,以包括最近处理的异常,取自sys.exc_info().然后由格式化程序包含异常消息(通过该Formatter.format_exception()方法)来格式化异常.

因为sys.exc_info()无论是在作品except套件和出,两种变型的工作.从代码文档的角度来看,如果在except处理程序中使用它会更清楚.

您不需要包含错误消息,因为您的日志格式化程序应该已经为您执行此操作:

logger.exception('debug message 2')  # exception should be included automatically
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令将异常显式附加到任何日志消息:

logger.error('debug message 2', exc_info=sys.exc_info())
Run Code Online (Sandbox Code Playgroud)

或具有异常类型,异常值和回溯的任何其他3元组值.或者,设置exc_info=1为让记录器从sys.exc_info()自身检索信息.

请参阅以下文档Logger.debug():

exc_info,如果它不计算为false,则会将异常信息添加到日志消息中.如果提供了异常元组(以返回的格式sys.exc_info()),则使用它; 否则,sys.exc_info()调用以获取异常信息.