bpo-37960: Silence only necessary errors in repr() of buffered and text streams. (GH-15543)
(cherry picked from commit b235a1b473
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
43b7ed77a8
commit
102130a63c
|
@ -407,7 +407,7 @@ class IOBase(metaclass=abc.ABCMeta):
|
||||||
"""Destructor. Calls close()."""
|
"""Destructor. Calls close()."""
|
||||||
try:
|
try:
|
||||||
closed = self.closed
|
closed = self.closed
|
||||||
except Exception:
|
except AttributeError:
|
||||||
# If getting closed fails, then the object is probably
|
# If getting closed fails, then the object is probably
|
||||||
# in an unusable state, so ignore.
|
# in an unusable state, so ignore.
|
||||||
return
|
return
|
||||||
|
@ -865,7 +865,7 @@ class _BufferedIOMixin(BufferedIOBase):
|
||||||
clsname = self.__class__.__qualname__
|
clsname = self.__class__.__qualname__
|
||||||
try:
|
try:
|
||||||
name = self.name
|
name = self.name
|
||||||
except Exception:
|
except AttributeError:
|
||||||
return "<{}.{}>".format(modname, clsname)
|
return "<{}.{}>".format(modname, clsname)
|
||||||
else:
|
else:
|
||||||
return "<{}.{} name={!r}>".format(modname, clsname, name)
|
return "<{}.{} name={!r}>".format(modname, clsname, name)
|
||||||
|
@ -2079,13 +2079,13 @@ class TextIOWrapper(TextIOBase):
|
||||||
self.__class__.__qualname__)
|
self.__class__.__qualname__)
|
||||||
try:
|
try:
|
||||||
name = self.name
|
name = self.name
|
||||||
except Exception:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
result += " name={0!r}".format(name)
|
result += " name={0!r}".format(name)
|
||||||
try:
|
try:
|
||||||
mode = self.mode
|
mode = self.mode
|
||||||
except Exception:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
result += " mode={0!r}".format(mode)
|
result += " mode={0!r}".format(mode)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
``repr()`` of buffered and text streams now silences only expected
|
||||||
|
exceptions when get the value of "name" and "mode" attributes.
|
|
@ -1378,12 +1378,14 @@ buffered_repr(buffered *self)
|
||||||
{
|
{
|
||||||
PyObject *nameobj, *res;
|
PyObject *nameobj, *res;
|
||||||
|
|
||||||
nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
|
if (_PyObject_LookupAttrId((PyObject *) self, &PyId_name, &nameobj) < 0) {
|
||||||
if (nameobj == NULL) {
|
if (!PyErr_ExceptionMatches(PyExc_ValueError)) {
|
||||||
if (PyErr_ExceptionMatches(PyExc_Exception))
|
|
||||||
PyErr_Clear();
|
|
||||||
else
|
|
||||||
return NULL;
|
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);
|
res = PyUnicode_FromFormat("<%s>", Py_TYPE(self)->tp_name);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -2860,14 +2860,14 @@ textiowrapper_repr(textio *self)
|
||||||
}
|
}
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
|
if (_PyObject_LookupAttrId((PyObject *) self, &PyId_name, &nameobj) < 0) {
|
||||||
if (nameobj == NULL) {
|
if (!PyErr_ExceptionMatches(PyExc_ValueError)) {
|
||||||
if (PyErr_ExceptionMatches(PyExc_Exception))
|
|
||||||
PyErr_Clear();
|
|
||||||
else
|
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
|
/* Ignore ValueError raised if the underlying stream was detached */
|
||||||
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
else {
|
if (nameobj != NULL) {
|
||||||
s = PyUnicode_FromFormat(" name=%R", nameobj);
|
s = PyUnicode_FromFormat(" name=%R", nameobj);
|
||||||
Py_DECREF(nameobj);
|
Py_DECREF(nameobj);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
|
@ -2876,14 +2876,10 @@ textiowrapper_repr(textio *self)
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
modeobj = _PyObject_GetAttrId((PyObject *) self, &PyId_mode);
|
if (_PyObject_LookupAttrId((PyObject *) self, &PyId_mode, &modeobj) < 0) {
|
||||||
if (modeobj == NULL) {
|
goto error;
|
||||||
if (PyErr_ExceptionMatches(PyExc_Exception))
|
|
||||||
PyErr_Clear();
|
|
||||||
else
|
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
else {
|
if (modeobj != NULL) {
|
||||||
s = PyUnicode_FromFormat(" mode=%R", modeobj);
|
s = PyUnicode_FromFormat(" mode=%R", modeobj);
|
||||||
Py_DECREF(modeobj);
|
Py_DECREF(modeobj);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
|
|
Loading…
Reference in New Issue