Search code examples
python-2.7exceptionpython-3.xtracebackraise

How to imitate Python 3's raise ... from in Python 2?


Python 3 has the neat

try:
    raise OneException('sorry')
except OneException as e:
    # after a failed attempt of mitigation:
    raise AnotherException('I give up') from e

syntax which allows raising a followup exception without loosing context. The best analogy I could come up with in Python 2 is

raise AnotherException((e,'I give up')), None, sys.exc_info()[2]

where the (e,'') is an ugly hack to have the original exception's name included in the message. But isn't there a better way?


Solution

  • There's a raise_from in python-future; simply install it

    pip install future
    

    and import to use

    from future.utils import raise_from
    # or: from six import reraise as raise_from
    
    class FileDatabase:
        def __init__(self, filename):
            try:
                self.file = open(filename)
            except IOError as exc:
                raise_from(DatabaseError('failed to open'), exc)
    

    UPDATE

    The compatibility package six also supports raise_from, from version 1.9 (released in 2015). It is used in the same manner as above.