我发现python 3相当于:
raise e[0], e[1], e[2]
看起来像这样:
raise e[0](e[1]).with_traceback(e[2])
但我得到第1个语法错误(在python 3中)或object has no attribute 'with_traceback'
(在python 2中)
如何为这两个版本编写这些行而没有错误?
答案 0 :(得分:1)
似乎six.reraise
就像你所追求的那样。
使用在py2和py3中都有效的不同回溯引发异常的示例:
from __future__ import print_function
import sys
import six
def this_should_show_up_in_the_traceback():
raise ValueError("an exception")
try:
this_should_show_up_in_the_traceback()
except:
type, value, tb = sys.exc_info()
print('stashed a traceback for later', type, value, tb)
six.reraise(IndexError, IndexError("other exception"), tb)
答案 1 :(得分:1)
根据兼容性问题
部分中的PEP 3109 -- Raising Exceptions in Python 3000三个表达式加注语句将从
转换而来raise E, V, T
到
e = E(V) e.__traceback__ = T raise e
在你的例子中
ex = e[0](e[1])
ex.__traceback__ = e[2]
raise ex