原始回溯的例外 - 2.6-3.X兼容版本

时间:2013-09-01 04:42:31

标签: python python-3.x python-2.6

假设我有一个这样的上下文管理器 - 它在Python 2.X中工作并在退出时保留回溯。

class MyContextManager(object):
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        raise AssertionError("Failed :-/"), None, traceback

在Python 3中,加注是语法错误,但我认为你可以设置__traceback__参数。

def __exit__(self, exc_type, exc_value, traceback):
    e = AssertionError("Failed :-/")
    e.__traceback__ = traceback
    raise e

有没有办法保留与Python 2和Python 3兼容的回溯(即,两者都不会产生语法错误)?我有点卡在这一点上。它需要在2.6,2.7,3.2和3.3中工作。目标是确保用户仍然可以看到早期的回溯。

1 个答案:

答案 0 :(得分:1)

我遇到的一个丑陋但可行的答案(受Ned Batchelder's guide to Python 3 compatibility启发)是编写一个函数来评估语法破坏代码,只有它是Python 2.例如:

if sys.version_info[0] == 2:
   s = """
def raise_with_traceback(exc, traceback):
    raise exc, None, traceback
"""
   exec (s)
else:
   def raise_with_traceback(exc, traceback):
       raise exc.with_traceback(traceback)

[提及@ user2357112关于{3}首选的with_traceback]。