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”还是有某种目的? 应该是else
。 else
子句只有在没有异常的情况下才会发生,就像 for
和 while
循环上的 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 日志记录 - 显式设置异常属性
在windows中配置pip安装源, 使用终端管理python虚拟环境, 自定义django的日志配置, 使用logging模块记录异常信息, 数据库用户及权限管理