gpt4 book ai didi

python - "Exception ignored in"是什么类型的消息?

转载 作者:太空狗 更新时间:2023-10-29 18:34:02 26 4
gpt4 key购买 nike

代码如下:

def g():
try:
yield 1
yield 2
yield 3
except GeneratorExit:
yield 4

gen = g()
print(gen.__next__())

如果你运行它你会看到:

1
Exception ignored in: <generator object g at 0x00000216BB546A98>
RuntimeError: generator ignored GeneratorExit

我明白发生了什么,但我找不到这个警告是什么类型的消息。

看起来它不是 logging 警告(我无法删除它设置日志记录级别)。它也不是 warnings 警告(它看起来不像我们调用 warnings.warn 时得到的)。

我认为它可以与异常相关联,但我无法用 sys.excepthook 捕获它,而 msg 本身消失了:

import sys

def hook(exc_type, exc_val, tb):
print(exc_type, exc_val, tb) # Nothing prints, while msg disappear

sys.excepthook = hook

我怎样才能捕捉到这个警告?

如何手动创建此类警告?

最佳答案

正如一些人所指出的,并非每个人都能得到您所描述的行为。例如,您不会在 REPL 中获得此行为。要在 REPL 上重现此行为,您必须在末尾添加 del gen。这让我们知道警告来自哪里。警告来自生成器对象的清理函数,它注意到生成器没有干净地退出。

具体发生的事情是,当解释器试图清理生成器并释放其资源时,生成器引发了异常。解释器无法将此异常传播回去,因此它会记录此状态并继续。具体来说,PyErr_WriteUnraisable正在被调用。和 here是它的称呼方式(我的评论)。

void
_PyGen_Finalize(PyObject *self)
{
...

if (gen is a coroutine) {
// special error detecting logic for coroutines
}
else {
res = gen_close(gen, NULL); // <- raises GeneratorExit
}

if (res == NULL) {
if (PyErr_Occurred()) {
PyErr_WriteUnraisable(self);
}
}
else {
Py_DECREF(res);
}

...
}

关于python - "Exception ignored in"是什么类型的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38036540/

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