Python compatibility: Catching exceptions

compatibility, exception, python, python-2.5, python-3.x

Solution

This concern is addressed in the Py3k docs. The solution is to check sys.exc_info():

from __future__ import print_function

try:
    raise Exception()
except Exception:
    import sys
    print(sys.exc_info()) # => (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x101c39830>) 
    exc = sys.exc_info()[1]
    print(type(exc)) # => <type 'exceptions.Exception'>
    print([a for a in dir(exc) if not a.startswith('__')]) # => ['args', 'message']

Problem

I have an application, that needs to be working in all "modern" Python versions, which means `2.5`-`3.2`. I don't want two code bases, so `2to3` is not an option. Consider something like this: ``` def func(input): if input != 'xyz': raise MyException(some_function(input)) return some_other_function(input) ``` How can I catch this exception, to get access to the exception object? `except MyException, e:` is not valid in Python 3, and `except MyException as e:` is not valid in python 2.5. Clearly it could have been possible to return the exception object, but I hope, i don't have to do this.

Original source