revisiting the "What am I running on?" question

Chris Angelico rosuav at gmail.com
Tue Feb 19 13:07:42 EST 2019


On Wed, Feb 20, 2019 at 3:26 AM Grant Edwards <grant.b.edwards at gmail.com> wrote:
>
> On 2019-02-19, Chris Angelico <rosuav at gmail.com> wrote:
>
> > Oh, and not just bugs either. If the user hits Ctrl-C at just the
> > right moment, KeyboardInterrupt will be raised. You'll swallow that
> > exception silently, preventing the user-requested halt, and going and
> > doing the wrong thing. Don't use a bare except clause even if your
> > code is 100% perfect every time. (And anyone who thinks their code is
> > perfect hasn't tested it.)
>
> IMO, you're allowed to use a bare except clause to do cleanup or
> logging as long as the execption handler ends with the line
>
>    raise
>

Yeah, I was clearer about that in the first email, to which that was a
followup, but I'll give two examples of valid bare-except constructs:

1) Handle-and-raise

try:
    weird stuff
except:
    show failure state
    raise

2) Log-and-continue

while True:
    try:
        thing = get_next_thing()
    except NoMoreThings, KeyboardInterrupt:
        break
    try:
        response = some_handler(thing)
    except:
        response = 500
        log_error()
    try:
        thing.respond(response)
    except OSError:
        pass

The implication of the second one is that (a) bugs in some_handler()
shouldn't break the whole program, and (b) attempting to halt
some_handler() with Ctrl-C shouldn't halt the whole program. It
creates a boundary.

But you should ALWAYS either reraise or log the exception. ALWAYS.
Otherwise, be specific about what you're swallowing.

ChrisA



More information about the Python-list mailing list