如何 运行 编写代码以在 python 中的错误中拆除对象

How to run code to tear down an object on errors in python

所以,我正在构建一个基础设施来处理自动启动实例、设置安全组等...

有时,在开发过程中会出现问题。处理一切的对象在实例化过程中途抛出一个错误,或者无数其他错误之一。发生这种情况时,我基本上会背负大量的基础设施。

问题是我不知道提前 when/where 会抛出错误。那么我的问题是,在出现任何错误的情况下,有什么办法可以 运行 拆除一些代码吗?例如:

class Foo(object):
    def __init__(self):
        # set up ec2 instance
        raise SomeError()

    def __on_error__(self):
        # tear down ec2 instances

另一个约束是一些拆卸代码可能会出错,这很好。通常,当我尝试拆除尚未实际实例化的内容时,就会发生这种情况。理想情况下,__on_error__ 函数中的任何内容都会无提示地失败,但如果没有将所有内容包装在 try/except:pass 循环中,我不确定如何实现这一点。

看起来有点像您在进行某种资源管理 -- 在这种情况下,上下文管理器非常好:

class Foo(object):
  ...
  def __enter__(self):
    return self

  def __exit__(self, exc_type, exc_value,tb):
    if exc_type is not None:
      # exception occurred, do some exception handling specific cleanup.
      self.__on_error__()

现在您可以将其用作上下文管理器:

with Foo() as foo:
    ...

当您执行完那组命令时,__exit__ 方法将 运行。

请注意,如果在 Foo.__init__ 中抛出异常,这对您没有帮助,因为直到 Foo.__enter__ returns.

之后才输入上下文