2

以下代码使python崩溃:

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

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

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

谁能解释这里背景中真正发生的事情?
这是堆栈溢出吗?

4

1 回答 1

5

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

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 优雅地处理这种情况。

于 2014-02-18T11:52:20.263 回答