【问题标题】:Raise an exception with traceback starting from caller从调用者开始使用回溯引发异常
【发布时间】:2015-08-14 07:35:07
【问题描述】:

我正在尝试为一个辅助项目制作一个自动化测试框架,并且可以使用一些帮助来创建断言检查。

在 python 中运行...

assert(False)

给你这个...

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    assert(False)
AssertionError

如您所见,回溯最低级别是assert(False)。所以我做了我的自定义断言,当断言成功时打印。

def custom_assert(condition):
    if condition:
        print("Yay! It werks!")
    else:
        raise Exception("Nay, it don't werks...")

custom_assert(False)

但是assert 给我的不是custom_assert 给我的。

Traceback (most recent call last):
  File "test.py", line 14, in <module>
    custom_assert(False)
  File "test.py", line 12, in custom_assert
    raise Exception("Nay, it don't werks...")
Exception: Nay, it don't werks...

这当然是默认行为。在 99.9999% 的时间里非常有用,但这是可以改进的一次。知道我在条件为假时调用的引发错误的方法引发了错误是没有用的。

我怎样才能让我的custom_assert 引发异常,并从调用者开始回溯,就像assert 一样?

P.S.:我不想打印它,我希望异常能够正确修改回溯,以便它也可以与调试器和其他工具一起正常工作!

编辑

澄清一下,我想要的回溯是这样的。

Traceback (most recent call last):
  File "test.py", line 14, in <module>
    custom_assert(False)
Exception: Nay, it don't werks...

【问题讨论】:

  • 检查traceback module,特别是。 extract_* 的东西。可能是你想要的。
  • 上一个示例中的回溯应该是什么样子?

标签: python exception python-3.x traceback


【解决方案1】:

你想要做的基本上是这样的:

tb = None
try:
    raise Exception('foo')
except Exception:
    tb = sys.exc_info()[2]

tb.tb_frame = tb.tb_frame.f_back # This line doesn't work
raise Exception('Nay it doesnt werks').with_traceback(tb)

但是您不能分配 tb_frame,并且由于在 CPython 代码中乱七八糟,这是 C 生成的数据结构(不是 python)(请参阅sys._getframe()) 所以你唯一的选择是模拟整个机器,然后说服 python 使用你的堆栈。这看起来像 jinja2 正在做的事情。如果你选择这样做,祝你好运! (当时不在我的范围内)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    相关资源
    最近更新 更多