gpt4 book ai didi

python - 在 python 中重写 stderr 的效果

转载 作者:行者123 更新时间:2023-11-28 21:56:13 25 4
gpt4 key购买 nike

以下代码使 python 崩溃:

import sys
sys.stdout = sys.stderr = None
print "goodbye world!"

我知道没有真正的理由编写这样的代码,但我想知道为什么它会崩溃。
我的第一个猜测是 print 命令失败,因为 stdout 被覆盖,然后在尝试引发异常时引发另一个异常,因为 stderr也被覆盖了。

因此它在尝试引发异常时发生堆栈溢出。

谁能解释一下这里的背景到底发生了什么?
这是堆栈溢出吗?

最佳答案

print 语句抛出异常,因为 sys.stdout 设置为 None:

>>> import sys
>>> sys.stdout = None
>>> print "goodbye world!"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'write'

仅此异常就足以让 Python 退出,因为您没有在任何地方处理异常。

但是,您也将 sys.stderr 设置为 None ,因此没有地方可以写入此回溯。这种情况在 PyErr_Display function 中是特殊情况:

PyObject *f = PySys_GetObject("stderr");
Py_INCREF(value);
if (f == NULL || f == Py_None)
fprintf(stderr, "lost sys.stderr\n");

这里 Python 将一条消息写入原始 stderr(操作系统交给 Python 的那个,而不是 sys.stderr)让您知道它无法告诉您到底出了什么问题。

不是崩溃,这是 Python 优雅地处理了这种情况。

关于python - 在 python 中重写 stderr 的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21852399/

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