Exceptions and Object Destruction

MRAB python at mrabarnett.plus.com
Sat Jun 13 03:26:50 CEST 2009


Nikolaus Rath wrote:
> Nikolaus Rath <Nikolaus at rath.org> writes:
>> Hi,
>>
>> Please consider this example:
> [....]
> 
> I think I managed to narrow down the problem a bit. It seems that when
> a function returns normally, its local variables are immediately
> destroyed. However, if the function is left due to an exception, the
> local variables remain alive:
> 
> ---------snip---------
> #!/usr/bin/env python
> import gc
> 
> class testclass(object):
>     def __init__(self):
>         print "Initializing"
>         
>     def __del__(self):
>         print "Destructing"
>             
> def dostuff(fail):
>     obj = testclass()
> 
>     if fail:
>         raise TypeError
>     
> print "Calling dostuff"
> dostuff(fail=False)
> print "dostuff returned"
> 
> try:
>     print "Calling dostuff"
>     dostuff(fail=True)
> except TypeError:
>     pass
> 
> gc.collect()
> print "dostuff returned"    
> ---------snip---------
> 
> 
> Prints out:
> 
> 
> ---------snip---------
> Calling dostuff
> Initializing
> Destructing
> dostuff returned
> Calling dostuff
> Initializing
> dostuff returned
> Destructing
> ---------snip---------
> 
> 
> Is there a way to have the obj variable (that is created in dostuff())
> destroyed earlier than at the end of the program? As you can see, I
> already tried to explicitly call the garbage collector, but this does
> not help.
> 
Are the objects retained because there's a reference to the stack
frame(s) in the traceback?



More information about the Python-list mailing list