Python __del__未在异常

时间:2016-11-24 12:37:39

标签: python exception destructor

我试图在一个类中包装一个写得不好的Python模块(我无法控制)。问题是如果我没有明确地调用该模块的关闭函数,那么python进程会在退出时挂起,所以我试图用一个具有 del的类来包装模块方法,但似乎没有在异常上调用 del 方法。

示例:

class Test(object):
    def __init__(self):
        # Initialize the problematic module here
        print "Initializing"

    def __del__(self):
        # Close the problematic module here
        print "Closing"

t = Test()
# This raises an exception
moo()

在这种情况下,不会调用 del 并且python挂起。每当对象超出范围时,我都需要以某种方式强制Python立即调用 del (比如C ++)。 请注意,我无法控制有问题的模块(即无法修复导致此问题的错误),也无法控制使用包装类的人(不能强制他们使用"使用& #34;因此我无法使用退出

有没有合适的方法来解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您希望在异常时释放某些资源,请考虑__enter__ + __exit__范例。

class Test(object):
    def __enter__(self):
        pass

    def __exit__(self):
        pass  # Release your resources here

with Test() as t:
    moo()

执行进入''阻止,方法__enter __()' t'被调用,然后由于正常流或异常而离开块,方法__exit __()由于' t'被称为。

答案 1 :(得分:0)

一个可能的解决方案是使用sys.excepthook,它允许您向全局异常处理程序引入自定义登录。您可以在其中添加一些代码以关闭模块的剩菜。

答案 2 :(得分:0)

请在下面找到详细信息:

class Test:
    def __init__(self):
        print('cons')
    
    def __del__(self):
        print('des')

如果我们在某个全局dict中添加Test类的对象,并在完成功能后清除该dict。它将调用析构函数

ctx = {}
def a():
    ctx['ao'] = Test()
    raise 1/0

a()

# cons
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "<stdin>", line 3, in a
# ZeroDivisionError: integer division or modulo by zero

如果我们释放ctx的旧内容并分配新值,则将调用析构函数

ctx  = {}
# des