Python 日志记录异常

Posted

技术标签:

【中文标题】Python 日志记录异常【英文标题】:Python logging exception 【发布时间】:2011-10-23 14:24:41 【问题描述】:

我目前正在编写一个包装类。我希望能够正确记录异常,但允许调用方法知道发生的异常。我的班级是这样的:

import logging

log = logging.getLogger('module')

class MyAPIWrapper(library.APIClass):

    def __init__(self):
        self.log = logging.getLogger('module.myapiwrapper')


    def my_wrapper_method(self):
        try:
            response = self.call_api_method()
            return response.someData
        except APIException, e:
            self.log.exception('Oh noes!')
            raise e #Throw exception again so calling code knows it happened

我有点怀疑捕获和异常只是为了记录它然后重新引发它,以便调用代码可以做一些事情。这里的正确模式是什么?

【问题讨论】:

python exception logging 的可能重复项 这正是我正在做的。感谢您发布这个问题。 【参考方案1】:

捕获日志并没有错。但是,我建议:

    try:
        response = self.call_api_method()
    except APIException, e:  # or 'as e' depending on your Python version
        self.log.exception('Oh noes!')
        raise #Throw exception again so calling code knows it happened
    else:
        return response.someData

只需做一个简单的raise,您就可以保留完整的回溯信息。在 else 子句中放置仅当您没有异常时才会发生的代码也更明确,并且更清楚您从哪一行捕获异常。

如果调用类仍在处理错误,也可以进行日志记录,但这对您的应用可能不方便。

编辑:try ... except ... else ... finally 的文档位于 compound statements 下。

【讨论】:

最后一个关键字应该是“except”而不是“else”还是有某种目的? 应该是elseelse 子句只有在没有异常的情况下才会发生,就像 forwhile 循环上的 else 子句只有在你没有 break 退出时才会发生。 太棒了!谢谢你的解释。【参考方案2】:

该方法是正确的,尽管您应该只使用raise 而不是raise e,它会自动重新引发最后一个异常。这也是认为可以使用毯子except 的少数情况之一。

这是一个与您在Handling Exceptions 上的 Python 文档中所做的非常相似的示例:

最后一个 except 子句可以省略异常名称,作为通配符。使用时要格外小心,因为用这种方式很容易掩盖真正的编程错误!它也可用于打印错误消息,然后重新引发异常(允许调用者也处理异常):

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except IOError as (errno, strerror):
    print "I/O error(0): 1".format(errno, strerror)
except ValueError:
    print "Could not convert data to an integer."
except:
    print "Unexpected error:", sys.exc_info()[0]
    raise

【讨论】:

以上是关于Python 日志记录异常的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 日志框架在带有回溯的警告或信息级别记录异常?

用于 Python 应用程序的 Azure Application Insights 日志记录 - 显式设置异常属性

Loguru:Python 日志终极解决方案

python 上下文处理错误,记录日志

AOP实现业务日志及异常日志记录

在windows中配置pip安装源, 使用终端管理python虚拟环境, 自定义django的日志配置, 使用logging模块记录异常信息, 数据库用户及权限管理