[Python-ideas] One-line "try with" statement

Nick Coghlan ncoghlan at gmail.com
Mon Mar 4 09:22:26 CET 2013


On Mon, Mar 4, 2013 at 5:50 AM, Stefan Behnel <stefan_ml at behnel.de> wrote:
> Andrew Barnert, 03.03.2013 14:24:
>> For example, if you do "with open(path) as f:" the context manager
>> doesn't (and shouldn't) do anything to protect you from a
>> FileNotFoundError in the open, or an IOError reading inside the block.
>> If you want to, say, log, or try a backup file, how else would you
>> handle that but a with inside a try?
>
> If you really care about errors when opening the file (i.e. when creating
> the context manager), then the correct way to do this is to only wrap the
> creation of the context manager in a try-except clause, i.e.
>
>     try:
>         f = open("somefile.txt")
>     except FileNotFoundError:
>         do_stuff()
>         raise   # or return, or whatever
>
>     with f:
>         do_other_stuff()
>
> Otherwise, you risk accidentally catching (and potentially shadowing)
> exceptions that originated from the body of the with statement instead of
> just the context manager creation.
>
> This may look a bit overly complicated for a file, but it quickly becomes
> more obvious for more complex context managers, e.g. those that may raise
> more common errors like ValueError or AttributeError.

Indeed - complex try blocks in general are a red flag when paired with
exception handlers for common exceptions.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia



More information about the Python-ideas mailing list