
Perhaps you could use try/finally:
try: prepare() do_something_sensitive() finally: cleanup()
Well I actually would like to run the else block in case an exception did occurred. Let me provide an example from my use case which is the management of a database transaction: with savepoint(transaction_manager): # Let's try to add into the database with some constraints. obj = db.add(data) db.flush() else: # Object already in database. obj = db.get(data) With the following context manager: class savepoint(object): def __init__(self): self._sp = None def __enter__(self, tm): self._sp = tm.savepoint() def __exit__(self, exc_ty, exc_val, tb): if exc_ty is not None and issubclass(ecx_ty, IntegrityError): self._sp.rollback() # We have an exception, execute else block. return False # All good, we commit our transaction. self._sp.commit() return True I find it quite a pretty, try and fail back way that I can easily replicate in my code without having to prepare and clean up each time with a try/catch.