On 2015-04-16 17:38, Steven D'Aprano wrote:
On Thu, Apr 16, 2015 at 08:35:14AM -0700, Ethan Furman wrote:
No more than any other block of code. There is nothing special about with blocks that go with exception handling [...]
I have to disagree: 'with' blocks are exactly a condensed try/finally, with the added capability of being able to suppress exceptions -- this makes them very special with respect to exception handling.
Yes, yes, that's a given that with statements encapsulate a finally clause. But that is missing the point. The proposal is not to add a finally clause to context managers, because they already have one. The proposal is to allow special syntax for the situation where you want a separate and independent finally.
with spam(): try: blockA except Error: blockB finally: blockC
The finally: blockC has nothing to do with the context manager's __exit__ method. We might as well be talking about this:
while spam(): try: blockA except Error: blockB finally: blockC
giving us syntactic sugar:
# not a serious proposal while spam(): blockA except Error: blockB finally: blockC
If I saw that I'd expect it to mean:
try: while spam(): blockA except Error: blockB finally: blockC
In fact, if I were a betting man, I'd venture a small wager that there are more while- or for-loops with try blocks inside them than with blocks. After all, the whole purpose of with statements is to avoid needing to write a try...finally!