Подтвердить что ты не робот

Как имитировать Python 3 raise... из Python 2?

Python 3 имеет аккуратный

try:
    raise OneException('sorry')
except OneException as e:
    # after a failed attempt of mitigation:
    raise AnotherException('I give up') from e
синтаксис

который позволяет повысить исключение для последующих операций без потери контекста. Лучшая аналогия, которую я мог бы найти в Python 2, -

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

где (e,'') является уродливым взломом, чтобы иметь исходное имя исключения, включенное в сообщение. Но нет ли лучшего способа?

4b9b3361

Ответ 1

Там raise_from в python-future; просто установите его

pip install future

и импортировать для использования

from future.utils import raise_from
# or: from six import 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

Совместимый пакет six также поддерживает raise_from, с версии 1.9 (выпущен в 2015 году). Он используется так же, как описано выше.

Ответ 2

Вместо использования six.raise_from попробуйте использовать six.reraise, как описано на этой странице:

http://python-future.org/compatible_idioms.html

from six import reraise as raise_ 
# or from future.utils import raise_

traceback = sys.exc_info()[2]
raise_(ValueError, "dodgy value", traceback)