【问题标题】:Ignore exceptions printed to stderr in __del__()忽略在 __del__() 中打印到 stderr 的异常
【发布时间】:2012-12-20 18:06:13
【问题描述】:

根据Python (2.7) documentation

由于 __del__() 方法的不稳定情况 调用,在执行期间发生的异常将被忽略,并且 一个警告被打印到 sys.stderr 代替

完全和绝对忽略 __del__() 中引发的异常的最 Pythonic 方式是什么——也就是说,不仅忽略异常,而且 没有打印到 sterr。有没有比临时将 stderr 重定向到 null 设备更好的方法?

【问题讨论】:

  • 您最好的选择是根本不使用__del__。具有讽刺意味的是,它使垃圾收集变得复杂,并且无法预测何时调用它。如果你能找到避免它的方法,你应该这样做。

标签: python


【解决方案1】:

我假设这是在您正在编写的 __del__() 函数中,如果是这样,请自己捕获异常并忽略它。

def __del__(self):
    try:
        # do whatever you need to here
    except Exception:
        pass

stderr 的日志记录仅适用于__del__() 中的未捕获异常。

【讨论】:

  • 您的假设在我的情况下失败了 - __del__() 在我正在使用的库中。在这种情况下有什么建议?
  • @Juan 你可以monkey patch 库,例如如果类是lib.Cls,那么你可以old_del = lib.Cls.__del__def new_del(self): try: old_del(self) except Exception: passlib.Cls.__del__ = new_del。 (显然这段代码需要一些换行符和缩进)。
【解决方案2】:

只需在__del__() 中使用try/except

def __del__(self):
   try:
      # ...
   except:
      pass

这将捕获所有异常并且不会打印任何内容。

【讨论】:

    【解决方案3】:

    只需使用 try/except 块:

    def __del__(self):
        try:
            something_that_might_throw()
        except:
            pass
    

    【讨论】:

      猜你喜欢
      • 2022-07-19
      • 2014-02-12
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多