Close 19609: narrow scope of codec exc chaining
This commit is contained in:
parent
91d2c5674a
commit
c4c2580d43
@ -2435,22 +2435,22 @@ class ExceptionChainingTest(unittest.TestCase):
|
|||||||
self.check_wrapped(RuntimeError(msg), msg)
|
self.check_wrapped(RuntimeError(msg), msg)
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def assertNotWrapped(self, operation, exc_type, msg):
|
def assertNotWrapped(self, operation, exc_type, msg_re, msg=None):
|
||||||
|
if msg is None:
|
||||||
|
msg = msg_re
|
||||||
with self.assertRaisesRegex(exc_type, msg) as caught:
|
with self.assertRaisesRegex(exc_type, msg) as caught:
|
||||||
yield caught
|
yield caught
|
||||||
actual_msg = str(caught.exception)
|
self.assertEqual(str(caught.exception), msg)
|
||||||
self.assertNotIn(operation, actual_msg)
|
|
||||||
self.assertNotIn(self.codec_name, actual_msg)
|
|
||||||
|
|
||||||
def check_not_wrapped(self, obj_to_raise, msg):
|
def check_not_wrapped(self, obj_to_raise, msg_re, msg=None):
|
||||||
self.set_codec(obj_to_raise)
|
self.set_codec(obj_to_raise)
|
||||||
with self.assertNotWrapped("encoding", RuntimeError, msg):
|
with self.assertNotWrapped("encoding", RuntimeError, msg_re, msg):
|
||||||
"str input".encode(self.codec_name)
|
"str input".encode(self.codec_name)
|
||||||
with self.assertNotWrapped("encoding", RuntimeError, msg):
|
with self.assertNotWrapped("encoding", RuntimeError, msg_re, msg):
|
||||||
codecs.encode("str input", self.codec_name)
|
codecs.encode("str input", self.codec_name)
|
||||||
with self.assertNotWrapped("decoding", RuntimeError, msg):
|
with self.assertNotWrapped("decoding", RuntimeError, msg_re, msg):
|
||||||
b"bytes input".decode(self.codec_name)
|
b"bytes input".decode(self.codec_name)
|
||||||
with self.assertNotWrapped("decoding", RuntimeError, msg):
|
with self.assertNotWrapped("decoding", RuntimeError, msg_re, msg):
|
||||||
codecs.decode(b"bytes input", self.codec_name)
|
codecs.decode(b"bytes input", self.codec_name)
|
||||||
|
|
||||||
def test_init_override_is_not_wrapped(self):
|
def test_init_override_is_not_wrapped(self):
|
||||||
@ -2475,8 +2475,23 @@ class ExceptionChainingTest(unittest.TestCase):
|
|||||||
self.check_not_wrapped(RuntimeError(1), "1")
|
self.check_not_wrapped(RuntimeError(1), "1")
|
||||||
|
|
||||||
def test_multiple_args_is_not_wrapped(self):
|
def test_multiple_args_is_not_wrapped(self):
|
||||||
msg = "\('a', 'b', 'c'\)"
|
msg_re = "\('a', 'b', 'c'\)"
|
||||||
self.check_not_wrapped(RuntimeError('a', 'b', 'c'), msg)
|
msg = "('a', 'b', 'c')"
|
||||||
|
self.check_not_wrapped(RuntimeError('a', 'b', 'c'), msg_re, msg)
|
||||||
|
|
||||||
|
# http://bugs.python.org/issue19609
|
||||||
|
def test_codec_lookup_failure_not_wrapped(self):
|
||||||
|
msg = "unknown encoding: %s" % self.codec_name
|
||||||
|
# The initial codec lookup should not be wrapped
|
||||||
|
with self.assertNotWrapped("encoding", LookupError, msg):
|
||||||
|
"str input".encode(self.codec_name)
|
||||||
|
with self.assertNotWrapped("encoding", LookupError, msg):
|
||||||
|
codecs.encode("str input", self.codec_name)
|
||||||
|
with self.assertNotWrapped("decoding", LookupError, msg):
|
||||||
|
b"bytes input".decode(self.codec_name)
|
||||||
|
with self.assertNotWrapped("decoding", LookupError, msg):
|
||||||
|
codecs.decode(b"bytes input", self.codec_name)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(sys.platform == 'win32',
|
@unittest.skipUnless(sys.platform == 'win32',
|
||||||
|
@ -370,8 +370,10 @@ PyObject *PyCodec_Encode(PyObject *object,
|
|||||||
goto onError;
|
goto onError;
|
||||||
|
|
||||||
result = PyEval_CallObject(encoder, args);
|
result = PyEval_CallObject(encoder, args);
|
||||||
if (result == NULL)
|
if (result == NULL) {
|
||||||
|
wrap_codec_error("encoding", encoding);
|
||||||
goto onError;
|
goto onError;
|
||||||
|
}
|
||||||
|
|
||||||
if (!PyTuple_Check(result) ||
|
if (!PyTuple_Check(result) ||
|
||||||
PyTuple_GET_SIZE(result) != 2) {
|
PyTuple_GET_SIZE(result) != 2) {
|
||||||
@ -392,7 +394,6 @@ PyObject *PyCodec_Encode(PyObject *object,
|
|||||||
Py_XDECREF(result);
|
Py_XDECREF(result);
|
||||||
Py_XDECREF(args);
|
Py_XDECREF(args);
|
||||||
Py_XDECREF(encoder);
|
Py_XDECREF(encoder);
|
||||||
wrap_codec_error("encoding", encoding);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,8 +419,10 @@ PyObject *PyCodec_Decode(PyObject *object,
|
|||||||
goto onError;
|
goto onError;
|
||||||
|
|
||||||
result = PyEval_CallObject(decoder,args);
|
result = PyEval_CallObject(decoder,args);
|
||||||
if (result == NULL)
|
if (result == NULL) {
|
||||||
|
wrap_codec_error("decoding", encoding);
|
||||||
goto onError;
|
goto onError;
|
||||||
|
}
|
||||||
if (!PyTuple_Check(result) ||
|
if (!PyTuple_Check(result) ||
|
||||||
PyTuple_GET_SIZE(result) != 2) {
|
PyTuple_GET_SIZE(result) != 2) {
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
@ -439,7 +442,6 @@ PyObject *PyCodec_Decode(PyObject *object,
|
|||||||
Py_XDECREF(args);
|
Py_XDECREF(args);
|
||||||
Py_XDECREF(decoder);
|
Py_XDECREF(decoder);
|
||||||
Py_XDECREF(result);
|
Py_XDECREF(result);
|
||||||
wrap_codec_error("decoding", encoding);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user