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()."""
|
||||
try:
|
||||
closed = self.closed
|
||||
except Exception:
|
||||
except AttributeError:
|
||||
# If getting closed fails, then the object is probably
|
||||
# in an unusable state, so ignore.
|
||||
return
|
||||
|
@ -865,7 +865,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)
|
||||
|
@ -2079,13 +2079,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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
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 {
|
||||
|
|
|
@ -2860,14 +2860,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)
|
||||
|
@ -2876,14 +2876,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)
|
||||
|
|
Loading…
Reference in New Issue