web-dev-qa-db-ja.com

Python 3のレイズ... from in Python 2?

Python3にはきちんとした

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,'')は、元の例外の名前をメッセージに含めるための醜いハックです。しかし、もっと良い方法はありませんか?

24
Tobias Kienzler

あります - raise_from in 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)

更新

互換性パッケージ six もサポートします raise_from 、バージョン1.9(2015年にリリース)から。上記と同じように使用します。

24
tutuDajuju

このページで説明されているように、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)
7
waltersantosf