[Python-Dev] PEP 310 and exceptions
holger krekel
hpk at trillke.net
Sat Apr 23 01:51:12 CEST 2005
Hi all,
probably unsuprisingly i am still pondering the idea of having
an optional __except__ hook on block handlers. The PEP says this
about this:
An extension to the protocol to include an optional __except__
handler, which is called when an exception is raised, and which
can handle or re-raise the exception, has been suggested. It is
not at all clear that the semantics of this extension can be made
precise and understandable. For example, should the equivalent
code be try ... except ... else if an exception handler is
defined, and try ... finally if not? How can this be determined
at compile time, in general?
In fact, i think the translation even to python code is not that tricky:
x = X():
...
basically translates to:
if hasattr(x, '__enter__'):
x.__enter__()
try:
...
except:
if hasattr(x, '__except__'): x.__except__(...)
else: x.__exit__()
else:
x.__exit__()
this is the original definition from the PEP with the added
except clause. Handlers are free to call 'self.__exit__()'
from the except clause. I don't think that anything needs to
be determined at compile time. (the above can probably be
optimized at the bytecode level but that is a side issue).
Moreover, i think that there are more than the "transactional"
use cases mentioned in the PEP. For example, a handler
may want to log exceptions to some tracing utility
or it may want to swallow certain exceptions when
its block does IO operations that are ok to fail.
cheers,
holger
More information about the Python-Dev
mailing list