使用语句析构函数来捕获init异常

时间:2014-01-21 17:06:02

标签: python destructor init with-statement

我使用带有以下类的with语句。

def __init__(self):
    ...

def __enter__(self):
    return self

def __exit__(self, type, value, traceback):
    print "EXIT Shutting the SDK down"
    ret = self.sdkobject.ShutDown()
    self.error_check(ret)

这可以捕获当我使用类的对象并安全地关闭我正在使用的SDK时发生的任何错误。但是,当类仍在初始化时,它会发现问题。我最近发现了“del”函数,它巧妙地解决了这个问题。但是,它不能与exit函数一起使用(因为with语句会唤醒exit并且del会获得异常)。如何使用with statemtent设置析构函数,即使在初始化期间也会捕获失败?

3 个答案:

答案 0 :(得分:2)

__init__中的异常需要直接在 方法中处理:

class YourContextManager(object):
    sdkobject = None

    def __init__(self):
        try:
             self._create_sdk_object()
        except Exception:
             if self.sdkobject is not None:
                 self.sdkobject.ShutDown()
             raise

    def _create_sdk_object(self):
        self.sdkobject = SomeSDKObject()
        self.sdkobject.do_something_that_could_raise_an_exception()

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        print "EXIT Shutting the SDK down"
        ret = self.sdkobject.ShutDown()
        self.error_check(ret)

请注意,异常会重新提出;您希望为上下文管理器的使用者提供处理创建上下文管理器失败的机会。

答案 1 :(得分:1)

创建一个单独的shutdown函数,该函数将在try/except的{​​{1}}块中调用,并且您需要正确关闭其他任何位置。

答案 2 :(得分:0)

__init__中捕获异常并处理它。 __del__是不必要的。