Python记录异常

23 python logging design-patterns exception

我正在写一个包装类.我希望能够正确记录异常但允许调用方法知道发生的异常.我的班级看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

我有点怀疑捕获和异常只是为了记录它然后重新提升它所以调用代码可以做些什么.这里的正确模式是什么?

agf*_*agf 27

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

    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
Run Code Online (Sandbox Code Playgroud)

通过裸露,raise你可以保留完整的追溯信息.放置代码只会在else子句中没有异常时才更明确,并且更清楚的是你从哪个行捕获异常.

如果它正在处理错误,那么调用类也可以进行日志记录,但这对您的应用程序来说可能不方便.

编辑:文档try ... except ... else ... finally是在复合语句下.

  • 它应该是'else`.只有在没有异常的情况下才会发生`else`子句,就像`for`和`while`循环中的`else`子句只有在你没有"断开"时才会发生. (4认同)

And*_*ark 6

这种方法是正确的,虽然raise e你应该只使用raise,这将自动重新引发最后一个异常.这也是使用毯子except被认为是可接受的罕见情况之一.

这是一个与处理异常的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
Run Code Online (Sandbox Code Playgroud)