summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-08-29 06:25:22 (GMT)
committerGitHub <noreply@github.com>2019-08-29 06:25:22 (GMT)
commitb235a1b47394eedc5f8ea4cf214f56c4c6932e59 (patch)
tree462594be94793d0fa1b757c8352925286e54264b
parentf5896a05edf5df91fb1b55bd481ba5b2a3682f4e (diff)
downloadcpython-b235a1b47394eedc5f8ea4cf214f56c4c6932e59.zip
cpython-b235a1b47394eedc5f8ea4cf214f56c4c6932e59.tar.gz
cpython-b235a1b47394eedc5f8ea4cf214f56c4c6932e59.tar.bz2
bpo-37960: Silence only necessary errors in repr() of buffered and text streams. (GH-15543)
-rw-r--r--Lib/_pyio.py8
-rw-r--r--Misc/NEWS.d/next/Library/2019-08-27-10-52-13.bpo-37960.CTY7Lw.rst2
-rw-r--r--Modules/_io/bufferedio.c12
-rw-r--r--Modules/_io/textio.c22
4 files changed, 22 insertions, 22 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index 40e0c9f..1b24ef9 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -409,7 +409,7 @@ class IOBase(metaclass=abc.ABCMeta):
"""Destructor. Calls close()."""
try:
closed = self.closed
- except Exception:
+ except AttributeError:
# If getting closed fails, then the object is probably
# in an unusable state, so ignore.
return
@@ -867,7 +867,7 @@ class _BufferedIOMixin(BufferedIOBase):
clsname = self.__class__.__qualname__
try:
name = self.name
- except Exception:
+ except AttributeError:
return "<{}.{}>".format(modname, clsname)
else:
return "<{}.{} name={!r}>".format(modname, clsname, name)
@@ -2083,13 +2083,13 @@ class TextIOWrapper(TextIOBase):
self.__class__.__qualname__)
try:
name = self.name
- except Exception:
+ except AttributeError:
pass
else:
result += " name={0!r}".format(name)
try:
mode = self.mode
- except Exception:
+ except AttributeError:
pass
else:
result += " mode={0!r}".format(mode)
diff --git a/Misc/NEWS.d/next/Library/2019-08-27-10-52-13.bpo-37960.CTY7Lw.rst b/Misc/NEWS.d/next/Library/2019-08-27-10-52-13.bpo-37960.CTY7Lw.rst
new file mode 100644
index 0000000..421cfb9
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-08-27-10-52-13.bpo-37960.CTY7Lw.rst
@@ -0,0 +1,2 @@
+``repr()`` of buffered and text streams now silences only expected
+exceptions when get the value of "name" and "mode" attributes.
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index 86dd277..586e93f 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -1378,12 +1378,14 @@ buffered_repr(buffered *self)
{
PyObject *nameobj, *res;
- nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
- if (nameobj == NULL) {
- if (PyErr_ExceptionMatches(PyExc_Exception))
- PyErr_Clear();
- else
+ if (_PyObject_LookupAttrId((PyObject *) self, &PyId_name, &nameobj) < 0) {
+ if (!PyErr_ExceptionMatches(PyExc_ValueError)) {
return NULL;
+ }
+ /* Ignore ValueError raised if the underlying stream was detached */
+ PyErr_Clear();
+ }
+ if (nameobj == NULL) {
res = PyUnicode_FromFormat("<%s>", Py_TYPE(self)->tp_name);
}
else {
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 05911d9..7ddac80 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -2899,14 +2899,14 @@ textiowrapper_repr(textio *self)
}
goto error;
}
- nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
- if (nameobj == NULL) {
- if (PyErr_ExceptionMatches(PyExc_Exception))
- PyErr_Clear();
- else
+ if (_PyObject_LookupAttrId((PyObject *) self, &PyId_name, &nameobj) < 0) {
+ if (!PyErr_ExceptionMatches(PyExc_ValueError)) {
goto error;
+ }
+ /* Ignore ValueError raised if the underlying stream was detached */
+ PyErr_Clear();
}
- else {
+ if (nameobj != NULL) {
s = PyUnicode_FromFormat(" name=%R", nameobj);
Py_DECREF(nameobj);
if (s == NULL)
@@ -2915,14 +2915,10 @@ textiowrapper_repr(textio *self)
if (res == NULL)
goto error;
}
- modeobj = _PyObject_GetAttrId((PyObject *) self, &PyId_mode);
- if (modeobj == NULL) {
- if (PyErr_ExceptionMatches(PyExc_Exception))
- PyErr_Clear();
- else
- goto error;
+ if (_PyObject_LookupAttrId((PyObject *) self, &PyId_mode, &modeobj) < 0) {
+ goto error;
}
- else {
+ if (modeobj != NULL) {
s = PyUnicode_FromFormat(" mode=%R", modeobj);
Py_DECREF(modeobj);
if (s == NULL)