28

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

4

2 に答える 2

26

python-futureraise_fromにあります。単にインストールする

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)

アップデート

互換パッケージsixraise_fromも、バージョン 1.9 (2015 年リリース) からサポートしています。使い方は上記と同じです。

于 2015-04-23T20:46:52.170 に答える