什么时候需要向Logger.exception传递异常对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么时候需要向Logger.exception传递异常对象?相关的知识,希望对你有一定的参考价值。

什么时候需要将一个异常对象传递给 Logger.exception?

对我来说,下面的模式比较好,因为我可以写一个自定义信息。

try:
    my_function()
except Exception as e:
    logger.exception('custom message')

是否有理由这样做。

try:
    my_function()
except Exception as e:
    logger.exception(e)  # the difference is passing the exception object to the log

我不传递它会损失哪些信息?

答案

在你这里所展示的特定情况下,并没有丢失信息。日志模块使用 sys.exc_info() 来获取当前异常的信息,所以只要你在那个异常块里面,就不需要传入异常。只有在异常对象不是当前异常的情况下才需要这样做,比如这样的情况。

import logging

try:
    some_func()
except ValueError as e:
    # handle ValueError here
    err = e
except OtherException as e:
    # handle OtherException here
    err = e
except Exception as e:
    # handle Exception here
    err = e

if err:
    logging.exception(err) # here we need to pass the exception object expicitely

也许值得注意的是,你也可以同时做到这两点,通过使用 logging.exception("your message", exc_info=e).

logging.exception 只是一个方便的包装 logging.error 而实际上是非常简单的这样实现的。(在cpython中)

    def exception(self, msg, *args, exc_info=True, **kwargs):
        self.log(ERROR, msg, *args, exc_info=exc_info, **kwargs)

以上是关于什么时候需要向Logger.exception传递异常对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何向Webservice里传递类参数

Android开发学习之路-回调实现Service向activity传递数据

C#同样是引用,ref和out到底有什么区别?

向Fragment传递参数,为什么用setArgument(),而不自定义变量再set赋值?

php向js的函数内传递参数-用经纬度计算2点间距离

Python向怎么向C语言传递结构体