2014-01-19 22 views
2

我發現蟒蛇3當量:Python2 「提高E [0],E [1],E [2]」 和python3版本在一個文件中

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

@pxl:但是其他的語法仍然會在Python 3拋出一個語法錯誤.. –

+0

有@MartijnPieters同意。我試過的第一件事是'如果six.PY3:... else:...'。但是我有一個語法錯誤 – Sergey

回答

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

根據部分兼容性問題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