【问题标题】:With statement destructor to catch init exceptions使用语句析构函数捕获初始化异常
【发布时间】:2014-02-11 10:17:17
【问题描述】:

我在下面的类中使用 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 设置析构函数,即使在初始化期间也会捕获失败?

【问题讨论】:

  • 你的意思是__init__中的异常也需要触发关机?

标签: python destructor init with-statement


【解决方案1】:

__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)

请注意,异常会重新引发;您希望给上下文管理器的使用者一个机会来处理创建上下文管理器的失败。

【讨论】:

    【解决方案2】:

    创建一个单独的 shutdown 函数,该函数在 __init__try/except 块中以及您需要正确关闭的其他任何地方调用。

    【讨论】:

    • init 类中的 try except 语句是否正常?
    • @Marmstrong:是的。为什么不呢?
    • 是的,把它们洒在需要的地方。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 2013-09-28
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多