[Python-ideas] with-except-finally blocks

MRAB python at mrabarnett.plus.com
Thu Apr 16 18:50:26 CEST 2015


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!
>



More information about the Python-ideas mailing list