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

raise_frompython-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)

更新

兼容性包也支持raise_from,从版本 1.9(2015 年发布)开始。它的使用方式与上述相同。

于 2015-04-23T20:46:52.170 回答
9

尝试使用 Six.reraise,而不是使用 Six.raise_from,如本页所述:

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)
于 2017-03-20T13:40:56.183 回答