gpt4 book ai didi

python - 从更高级别引发异常,a la warnings

转载 作者:太空狗 更新时间:2023-10-29 20:28:20 25 4
gpt4 key购买 nike

在模块 warnings ( https://docs.python.org/3.5/library/warnings.html ) 中,可以发出警告,该警告似乎来自堆栈中较早的地方:

warnings.warn('This is a test', stacklevel=2)

是否有引发错误的等价物?我知道我可以使用替代回溯引发错误,但我无法在模块中创建该回溯,因为它需要来自更早的地方。我想象的是这样的:

tb = magic_create_traceback_right_here()
raise ValueError('This is a test').with_traceback(tb.tb_next)

原因是我正在开发一个具有函数 module.check_raise 的模块,我想引发一个错误,该错误似乎源自调用该函数的位置。如果我在 module.check_raise 函数中引发错误,它似乎源自 module.check_raise 内部,这是不受欢迎的。

另外,我尝试了一些技巧,例如引发虚拟异常、捕获它并传递回溯,但不知何故 tb_next 变成了 None。我没主意了。

编辑:

我想要这个最小示例(称为 tb2.py)的输出:

import check_raise

check_raise.raise_if_string_is_true('True')

只是这样:

Traceback (most recent call last):
File "tb2.py", line 10, in <module>
check_raise.raise_if_string_is_true(string)
RuntimeError: An exception was raised.

最佳答案

我不敢相信我会发布这个

通过这样做您将反对the zen .

Special cases aren't special enough to break the rules.

但如果你坚持这里是你的魔法代码。

check_raise.py
import sys
import traceback

def raise_if_string_is_true(string):
if string == 'true':
#the frame that called this one
f = sys._getframe().f_back
#the most USELESS error message ever
e = RuntimeError("An exception was raised.")

#the first line of an error message
print('Traceback (most recent call last):',file=sys.stderr)
#the stack information, from f and above
traceback.print_stack(f)
#the last line of the error
print(*traceback.format_exception_only(type(e),e),
file=sys.stderr, sep="",end="")

#exit the program
#if something catches this you will cause so much confusion
raise SystemExit(1)
# SystemExit is the only exception that doesn't trigger an error message by default.

这是纯 python,不会干扰 sys.excepthook,即使在 try block 中也不会被 except Exception: 捕获,尽管它被 捕获>除了:

测试.py
import check_raise

check_raise.raise_if_string_is_true("true")
print("this should never be printed")

将为您提供您想要的(信息量极少且极其伪造的)追溯消息。

Tadhgs-MacBook-Pro:Documents Tadhg$ python3 test.py
Traceback (most recent call last):
File "test.py", line 3, in <module>
check_raise.raise_if_string_is_true("true")
RuntimeError: An exception was raised.
Tadhgs-MacBook-Pro:Documents Tadhg$

关于python - 从更高级别引发异常,a la warnings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com