open() and EOFError

Roy Smith roy at panix.com
Mon Jul 7 20:22:26 EDT 2014


In article <53bae1db$0$29995$c3e8da3$5496439d at news.astraweb.com>,
 Steven D'Aprano <steve+comp.lang.python at pearwood.info> wrote:


> While I agree with the general idea that try blocks should be as narrow 
> *as reasonable*, they shouldn't be as narrow *as possible* since one can 
> start guarding against unreasonable things.

I'm more willing to accept multi-statement try blocks with multiple 
except clauses when the things you're catching are very specific:

try:
    foo.quack()
    bar.roar()
except Foo.QuackError:
    print "OMG, can't quack"
except Bar.RoarError:
    print "Yowza"

If you're catching generic things like IOError or ValueError, it's more 
likely for there to be some code path you didn't expect.

> The thing is, even if you catch these bizarre things, what are you going 
> to do with them? If you can't do anything about it, there's no point 
> catching the exception -- never catch anything you can't recover from, or 
> otherwise handle. Just treat it as a fatal error and let it cause a 
> traceback.

That I agree with.  Of course, sometimes you do want to catch 
*everything*.  For example, in something like a web server, you want to 
have something like

try:
   do_request()
except Exception:
   handle_exception()
except:
   # WTF?  This should never happen, but deal with it anyway
   handle_exception()

way up at the top.  Our handle_exception() logs a stack trace and 
returns a 500-something HTTP response.  The alternative is to have the 
web server exit, which would be a Bad Thing.  Well, actually, if that 
happened, the gunicorn master process would catch that a worker exited 
and restart it, but that would be slow.  And if gunicorn exited, then 
upstart would catch that, and restart gunicorn :-)



More information about the Python-list mailing list