[Python-Dev] Explicitly declaring expected exceptions for a block
Dmitry Dvoinikov
dmitry at targeted.org
Wed Jun 22 06:09:49 CEST 2005
> It was possible in PEP 340 and in early drafts of PEP 346, but it
> isn't possible in PEP 343.
> In PEP 343, the statement template *cannot* suppress exceptions - it
> can react to them, and it can turn them into different exceptions, but
> that's all.
...doing homework...
The following code, combined from PEP 343 and Mr. Du Bois suggestion:
--------------------------------------------------------------
from sys import exc_info
class ignored_exceptions(object):
def __init__(self, *exceptions):
self.exceptions = exceptions
def __enter__(self):
return None
def __exit__(self, type, value, traceback):
try:
raise type, value, traceback
except self.exceptions:
pass
try:
with = ignored_exceptions(TypeError)
with.__enter__()
try:
try:
raise TypeError()
except:
exc = exc_info()
raise
finally:
with.__exit__(*exc)
except:
print exc_info()
--------------------------------------------------------------
still yields exceptions.TypeError.
Now, back to original question then, do you think it'd be
beneficial to have some sort of exception ignoring or expecting
statement ?
Sincerely,
Dmitry Dvoinikov
http://www.targeted.org/
--- Original message follows ---
> Paul Du Bois wrote:
>> If I understand PEP 343 correctly, it allows for easy implementation
>> of part of your request. It doesn't implement the else: clause, but
>> you don't give a use case for it either.
>>
>> class ignored_exceptions(object):
>> def __init__(self, *exceptions):
>> self.exceptions = exceptions
>> def __enter__(self):
>> return None
>> def __exit__(self, type, value, traceback):
>> try:
>> raise type, value, traceback
>> except self.exceptions:
>> pass
>>
>> with ignored_exceptions(SomeError):
>> do stuff
>>
>> I don't see the use, but it's possible.
> It was possible in PEP 340 and in early drafts of PEP 346, but it
> isn't possible in PEP 343.
> In PEP 343, the statement template *cannot* suppress exceptions - it
> can react to them, and it can turn them into different exceptions, but
> that's all.
> And yes, this is deliberate - the control flow is too murky otherwise:
> with some_template():
> raise TypeError
> print "Hi!"
> Does that code print "Hi!" or not? Under PEP 343, you know it doesn't,
> because the TypeError isn't trapped. If templates could actually
> suppress exceptions, you'd have no idea what the code does without
> looking up the definition of 'some_template' - this is a bad thing,
> which is why PEP 343 defines the semantics the way it does.
> However, I'm with Michael - every time I've needed something like
> this, I have had non-trivial code in either the 'except' or the 'else'
> blocks of the try statement.
> Regards,
> Nick.
More information about the Python-Dev
mailing list