diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-08-29 06:25:22 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-29 06:25:22 (GMT) |
commit | b235a1b47394eedc5f8ea4cf214f56c4c6932e59 (patch) | |
tree | 462594be94793d0fa1b757c8352925286e54264b | |
parent | f5896a05edf5df91fb1b55bd481ba5b2a3682f4e (diff) | |
download | cpython-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.py | 8 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2019-08-27-10-52-13.bpo-37960.CTY7Lw.rst | 2 | ||||
-rw-r--r-- | Modules/_io/bufferedio.c | 12 | ||||
-rw-r--r-- | Modules/_io/textio.c | 22 |
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) |