Generic Exception Handling in Python the "Right Way" Generic Exception Handling in Python the "Right Way" python python

Generic Exception Handling in Python the "Right Way"


You could use the with statement if you have python 2.5 or above:

from __future__ import with_statementimport contextlib@contextlib.contextmanagerdef handler():    try:        yield    except Exception, e:        baz(e)

Your example now becomes:

with handler():    foo(a, b)with handler():    bar(c, d)


If this is always, always the behaviour you want when a particular function raises an exception, you could use a decorator:

def handle_exception(handler):    def decorate(func):        def call_function(*args, **kwargs):            try:                func(*args, **kwargs)            except Exception, e:                handler(e)        return call_function    return decoratedef baz(e):    print(e)@handle_exception(baz)def foo(a, b):    return a + b@handle_exception(baz)def bar(c, d):    return c.index(d)

Usage:

>>> foo(1, '2')unsupported operand type(s) for +: 'int' and 'str'>>> bar('steve', 'cheese')substring not found


If they're simple one-line commands, you can wrap them in lambdas:

for cmd in [    (lambda: foo (a, b)),    (lambda: bar (c, d)),]:    try:        cmd ()    except StandardError, e:        baz (e)

You could wrap that whole thing up in a function, so it looked like this:

ignore_errors (baz, [    (lambda: foo (a, b)),    (lambda: bar (c, d)),])