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,'')
は、元の例外の名前をメッセージに含めるための醜いハックです。しかし、もっと良い方法はありませんか?
あります - 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年にリリース)から。上記と同じように使用します。
このページで説明されているように、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)