4

У меня есть приложение, которое должно работать во всех «современных» версиях Python, что означает 2.5 - 3.2. Мне не нужны две базы кода, поэтому 2to3 не является вариантом.Совместимость с Python: Захватывающие исключения

Рассмотрим что-то вроде этого:

def func(input): 
    if input != 'xyz': 
     raise MyException(some_function(input)) 
    return some_other_function(input) 

Как я могу поймать это исключение, чтобы получить доступ к объекту исключения? except MyException, e: недействителен в Python 3, а except MyException as e: недействителен в python 2.5.

Очевидно, что было возможно вернуть объект исключения, но я надеюсь, что мне не нужно это делать.

ответ

5

Данная проблема адресована in the Py3k docs. Решение состоит в том, чтобы проверить 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']