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 lambda
s:
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)),])