26.07.19 23:46, MRAB пише:
On 2019-07-26 19:26, Serhiy Storchaka wrote: [snip]
I propose to add "except" clause to "for" and "with" statement to catch exceptions in the code that can't be wrapped with "try ... except".
for VAR in EXPR: BLOCK except EXC: HANDLER
should be equivalent to
try: _it = iter(EXPR) except EXC: HANDLER else: while True: try: VAR = next(_it) except StopIteration: break except EXC: HANDLER break BLOCK
[snip] 1. The 'for' loop can have an 'else' clause, and so can the 'try' statement. Is there any ambiguity over its meaning?
An 'else' clause is already have different meanings in different statements: 'if', 'try' and 'while'/'for'. This proposition does not add anything new to this. If an exception is not raised in 'for' or 'with' then its body is executed. So no need to add an 'else' clause in the meaning of 'try'. There will be no conflict between two 'else'.
2. In your example you have it catching the exception if EXPR or iter(EXPR) raises. Is that a good idea?
Definitely we should catch the exception if EXPR is raised in the 'with' statement, because different content managers can acquire resources either in `__enter__` or in constructor (like open()). There is less confidence about 'for', but I think that it is better to catch it, because iter() is called implicitly and there is no way to catch an exception in it. iter() can raise an exception: >>> f = open('python') >>> f.close() >>> iter(f) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file. But all this is discussable.