aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-05-14 17:15:50 +0200
committerVictor Stinner <victor.stinner@gmail.com>2014-05-14 17:15:50 +0200
commite2d66903e8e336817702213f0cd8c3a24edf03ac (patch)
treedec47334b101cdb50d63548f86c5435193293b6d
parentBacked out changeset 6ceedbd88b5f (diff)
downloadcpython-e2d66903e8e336817702213f0cd8c3a24edf03ac.tar.gz
cpython-e2d66903e8e336817702213f0cd8c3a24edf03ac.tar.bz2
cpython-e2d66903e8e336817702213f0cd8c3a24edf03ac.zip
Issue #21497: faulthandler functions now raise a better error if sys.stderr is
None: RuntimeError("sys.stderr is None") instead of AttributeError("'NoneType' object has no attribute 'fileno'").
-rw-r--r--Lib/test/test_faulthandler.py25
-rw-r--r--Modules/faulthandler.c4
2 files changed, 29 insertions, 0 deletions
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index ebd99edc8fc..b0fc279706d 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -591,6 +591,31 @@ sys.exit(exitcode)
def test_register_chain(self):
self.check_register(chain=True)
+ @contextmanager
+ def check_stderr_none(self):
+ stderr = sys.stderr
+ try:
+ sys.stderr = None
+ with self.assertRaises(RuntimeError) as cm:
+ yield
+ self.assertEqual(str(cm.exception), "sys.stderr is None")
+ finally:
+ sys.stderr = stderr
+
+ def test_stderr_None(self):
+ # Issue #21497: provide an helpful error if sys.stderr is None,
+ # instead of just an attribute error: "None has no attribute fileno".
+ with self.check_stderr_none():
+ faulthandler.enable()
+ with self.check_stderr_none():
+ faulthandler.dump_traceback()
+ if hasattr(faulthandler, 'dump_traceback_later'):
+ with self.check_stderr_none():
+ faulthandler.dump_traceback_later(1e-3)
+ if hasattr(faulthandler, "register"):
+ with self.check_stderr_none():
+ faulthandler.register(signal.SIGUSR1)
+
if __name__ == "__main__":
unittest.main()
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index fff960fa961..6a145dc5f04 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -144,6 +144,10 @@ faulthandler_get_fileno(PyObject *file, int *p_fd)
PyErr_SetString(PyExc_RuntimeError, "unable to get sys.stderr");
return NULL;
}
+ if (file == Py_None) {
+ PyErr_SetString(PyExc_RuntimeError, "sys.stderr is None");
+ return NULL;
+ }
}
result = _PyObject_CallMethodId(file, &PyId_fileno, "");