Reliable destruction

Benjamin Niemann pink at odahoda.de
Thu Aug 4 13:57:36 CEST 2005


Pierre-Eric.Melchy at uni-konstanz.de wrote:

> Hello,
> 
> I have a class measurement representing a physical measurement.
> Different objects in this class represent laboratory equipment, which
> might raise an exception (e.g. overtemperature).
> 
> In any case the equipment has to be switched off after the experiment,
> since if a
> power supply stays in the on state for a prolonged time equipment may
> be
> destroyed. Switching off is done by invoking the destructors of the
> instruments.
> 
> My measurement looks like this:
> 
> class measurement:
> def __init__(self):
> self.setup()
> self.run()
> 
> def setup(self):
> self.powerSupply=apparate.PowerSupply()
> self.magnet=apparate.magnet() # Exception("Communication Error")
> self.thermo=apparate.thermometer()
> # some 5 more instruments
> 
> def run():
> for i in range(100)
> self.powerSupply.setCurrent(i) # Exception("Overcurrent")
> self.magnet.setField(0.5*i)
> 
> 
> Different measurements are executed in a script which might run
> overnight:
> If one measurement raises an exception the next one might still work
> and I don't
> want to loose the results from the following experiments.
> 
> try:
> measurement()
> except:
> pass
> try:
> measurement2()
> except:
> pass
> 
> 
> An exception might be thrown anywhere in init or run if e.g. the
> PowerSupply
> overheats. Maybe an asynchronous event might happen, too (user
> interrupt with ^C but I might live without that if it is impossible to
> handle)
> 
> My questions are:
> 1) under normal conditions (no exceptions) is there a guarantee, that
> __del__ of
> all instruments is called at the end of measurement()?
> 
> 2) if an exception is thrown, will all instruments be deleted if the
> error
> occurs in run() ?
> (only the instruments already initialized if the error occurs
> in setup() )?
> 
> I am using CPython (on WinXP) and there are no reference cycles between
> the instruments.
> 
> I have to stress again that a reliable finalization is important and
> cannot wait
> until the interpreter shuts down.
> 
> I have tried this and it seems to work but this is of course no
> guarantee.

I would suggest an explicit tearDown() method

try:
    m = measurement()
    try:
        m.setup()
        m.run()
    finally:
        m.tearDown()
except KeyboardInterrupt:
    # user pressed ctrl-C
    print "***BREAK"
    sys.exit(1)
except:
    # you should at least log the exception for later debugging
    traceback.print_exc()

and remove the calls to setup() and run() from the constructor.

-- 
Benjamin Niemann
Email: pink at odahoda dot de
WWW: http://www.odahoda.de/



More information about the Python-list mailing list