summaryrefslogtreecommitdiff
path: root/Python/codecs.c
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2013-11-13 23:49:21 +1000
committerNick Coghlan <ncoghlan@gmail.com>2013-11-13 23:49:21 +1000
commit644dcdc965cc26de0542280e625dbe6cd1a070ed (patch)
tree06c3072219dca0f72320615aa4a8bf7348e22e32 /Python/codecs.c
parent04bc197701ee728c336b097129d912f2c94839f8 (diff)
downloadcpython-644dcdc965cc26de0542280e625dbe6cd1a070ed.tar.gz
Close #17828: better handling of codec errors
- output type errors now redirect users to the type-neutral convenience functions in the codecs module - stateless errors that occur during encoding and decoding will now be automatically wrapped in exceptions that give the name of the codec involved
Diffstat (limited to 'Python/codecs.c')
-rw-r--r--Python/codecs.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/Python/codecs.c b/Python/codecs.c
index c541ba02b1..e2edc269a8 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -332,6 +332,22 @@ PyObject *PyCodec_StreamWriter(const char *encoding,
return codec_getstreamcodec(encoding, stream, errors, 3);
}
+/* Helper that tries to ensure the reported exception chain indicates the
+ * codec that was invoked to trigger the failure without changing the type
+ * of the exception raised.
+ */
+static void
+wrap_codec_error(const char *operation,
+ const char *encoding)
+{
+ /* TrySetFromCause will replace the active exception with a suitably
+ * updated clone if it can, otherwise it will leave the original
+ * exception alone.
+ */
+ _PyErr_TrySetFromCause("%s with '%s' codec failed",
+ operation, encoding);
+}
+
/* Encode an object (e.g. an Unicode object) using the given encoding
and return the resulting encoded object (usually a Python string).
@@ -376,6 +392,7 @@ PyObject *PyCodec_Encode(PyObject *object,
Py_XDECREF(result);
Py_XDECREF(args);
Py_XDECREF(encoder);
+ wrap_codec_error("encoding", encoding);
return NULL;
}
@@ -422,6 +439,7 @@ PyObject *PyCodec_Decode(PyObject *object,
Py_XDECREF(args);
Py_XDECREF(decoder);
Py_XDECREF(result);
+ wrap_codec_error("decoding", encoding);
return NULL;
}