作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在模块 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.
但如果你坚持这里是你的魔法代码。
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:
捕获,尽管它被 捕获>除了:
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/
我是一名优秀的程序员,十分优秀!