En Mon, 06 Jul 2009 18:15:44 -0300, Scott David Daniels
<scott.dani...@acm.org> escribió:
brasse wrote:
I have been thinking about how write exception safe constructors in
Python. By exception safe I mean a constructor that does not leak
resources when an exception is raised within it.
...
> As you can see this is less than straight forward. Is there some kind
> of best practice that I'm not aware of?
Not so tough. Something like this tweaked version of your example:
Another variant: Presumably, there is already a method in Bar responsible
for "normal" cleanup; just make sure it gets called (and write it in a
robust way):
class Foo(object):
def __init__(self, name, fail=False):
self.name = name
if not fail:
print '%s.__init__(%s)' % (type(self).__name__, name)
else:
print '%s.__init__(%s), FAIL' % (type(self).__name__, name)
raise ValueError('Asked to fail: %r' % fail)
def close(self):
print '%s.close(%s)' % (type(self).__name__, self.name)
class Bar(object):
a = None # default values
b = None
def __init__(self):
try:
self.a = Foo('a')
self.b = Foo('b', fail=True)
except Exception, why:
self.cleanup()
raise
def cleanup(self):
if self.a is not None:
self.a.close()
if self.b is not None:
self.b.close()
bar = Bar()
--
Gabriel Genellina
--
http://mail.python.org/mailman/listinfo/python-list