python - 引发异常并从调用者开始进行回溯

标签 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)

但是 custom_assert 给了我这个,而不是 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...

最佳答案

本质上,您想要做的事情与此类似:

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 正在做的事情。如果您选择这样做,祝您好运! (这超出了我的范围)

关于python - 引发异常并从调用者开始进行回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30563392/

相关文章:

Python WhiteNoise 在 Flask 应用程序中不是 gzip 压缩

datetime - 将日期、日期时间转换为时间戳

python - 处理 pandas.datetime 类型时出现消息 "Exception ignored"

python - 如何在 python 上解决 TISE 的简单边值问题

python - 在 pandas dataframe 数组中加载乘法 csv,并以索引作为文件名

python - 当移动物体偏离路径特定幅度时如何发出警告?

java - 我可以在单个类文件中在 java 中定义多个自定义异常并通过方法调用它们吗?

java - 如何在访问者模式中使用检查异常

python - PRAW:get_submission 工作不一致

python - 从谷歌搜索结果中抓取的旧新闻文章