Как имитировать 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,'')
является уродливым взломом, чтобы иметь исходное имя исключения, включенное в сообщение. Но нет ли лучшего способа?
Ответы
Ответ 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)