[Python-ideas] with statement vs. try...except...finally

Mike Meyer mwm-keyword-python.b4bdba at mired.org
Sat May 30 03:14:01 CEST 2009


On Sat, 30 May 2009 10:30:40 +1000
Steven D'Aprano <steve at pearwood.info> wrote:
> and if for some bizarre reason you want to catch errors in the context 
> manager but not the body of with, you can manually emulate with:
> 
> # untested
> try:
>     try:
>         f = open(filename).__enter__()
>     except Exception:
>         f = None
>     process(f)
> finally:
>     if f is not None:
>         f.__exit__()
> 
> 
> That fourth case is ugly, but it's also rare. I can't imagine a case 
> where you'd need it, but if you do, you can do it.

That was the case that first drove me to think about extending
with. The starting point was a loop:

    while retries < maxretries:
        try:    
            with my_magic_lock:
                process()
        except ProcessException:
	    handle()
	except:
	   pass
	retries += 1

If entering my_magic_lock throws an exception, I don't care - I'm
going to retry it anyway. We encountered a condition that caused
my_magic_lock to throw ProcessException, so handle() would run without
the lock and potentially corrupt our data. Extending with and wanting
a way to throw an except *over* the first surrounding try:/except:
both occurred to me. What I eventually did was push the loop into a
wrapper context manager.

     <mike
-- 
Mike Meyer <mwm at mired.org>		http://www.mired.org/consulting.html
Independent Network/Unix/Perforce consultant, email for more information.

O< ascii ribbon campaign - stop html mail - www.asciiribbon.org



More information about the Python-ideas mailing list