【问题标题】:Exception with original traceback - 2.6-3.X compatible version原始回溯的异常 - 2.6-3.X 兼容版本
【发布时间】:2013-09-04 12:08:14
【问题描述】:

假设我有一个这样的上下文管理器 - 它在 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 中,raise 是一个语法错误,但我认为你可以设置 __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 中工作。目标是确保用户仍能看到较早的回溯。

【问题讨论】:

  • 我认为 3.x 的首选方式实际上是 raise AssertionError("Failed :-/").with_traceback(traceback),但这对 2.6 的兼容性没有帮助。
  • @user2357112 不幸的是,这在 2.7 中也不起作用。可能是最好的选择,因为它可以在 Python 3 和 2.7 中工作。

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


【解决方案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 致敬,with_traceback 是 Python 3 的首选]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 2018-08-29
    • 2020-09-18
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多