从调用者开始使用回溯引发异常

时间:2015-05-31 22:31:43

标签: python exception python-3.x traceback

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

在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%的时间,但这是有一次它可以改善。知道我在条件为false时调用以引发错误的方法引发错误是没有用的。

如何使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...

1 个答案:

答案 0 :(得分:0)

基本上你想要做的是类似的事情:

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正在做的事情。如果你选择做什么,祝你好运! (那时它超出了我的范围)