以与Python 2和Python 3无关的方式重新引发异常

Re-raising exception, in a way agnostic to Python 2 and Python 3

本问题已经有最佳答案,请猛点这里访问。

我在Python 3中有一个脚本,它使用'from'关键字重新引发异常(如此Stackoverflow问题的答案中所示:使用不同的类型和消息重新引发异常,保留现有信息)

我现在必须返回并使脚本与Python 2.7兼容。 'from'关键字不能在Python 2.7中以这种方式使用。 我发现在Python 2中,重新引发异常的方法如下:

1
2
3
4
5
try:
    foo()
except ZeroDivisionError as e:
    import sys
    raise MyCustomException, MyCustomException(e), sys.exc_info()[2]

但是,虽然此语法在Python 2.7中有效,但它不适用于Python 3。

是否有一种可接受的方法可以在Python中重新引发适用于Python 2.7和Python 3的异常?


1
2
3
4
5
6
7
8
9
10
11
12
13
# Python 3 only
try:
    frobnicate()
except KeyError as exc:
    raise ValueError("Bad grape") from exc

# Python 2 and 3:
from future.utils import raise_from

try:
    frobnicate()
except KeyError as exc:
    raise_from(ValueError("Bad grape"), exc)