Skip to content

Commit 563e204

Browse files
committed
Enhance dbm module error messages with descriptive type information
1 parent 24ee255 commit 563e204

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

Modules/_dbmmodule.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,9 @@ dbm_ass_sub_lock_held(PyObject *self, PyObject *v, PyObject *w)
236236
dbmobject *dp = dbmobject_CAST(self);
237237

238238
if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) {
239-
PyErr_SetString(PyExc_TypeError,
240-
"dbm mappings have bytes or string keys only");
239+
PyErr_Format(PyExc_TypeError,
240+
"dbm key returned %.100s for value %R But database keys must be bytes or str, not %.100s",
241+
Py_TYPE(v)->tp_name, v, Py_TYPE(v)->tp_name);
241242
return -1;
242243
}
243244
_dbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
@@ -263,8 +264,9 @@ dbm_ass_sub_lock_held(PyObject *self, PyObject *v, PyObject *w)
263264
}
264265
} else {
265266
if ( !PyArg_Parse(w, "s#", &drec.dptr, &tmp_size) ) {
266-
PyErr_SetString(PyExc_TypeError,
267-
"dbm mappings have bytes or string elements only");
267+
PyErr_Format(PyExc_TypeError,
268+
"dbm value returned %.100s for value %R But database values must be bytes or str, not %.100s",
269+
Py_TYPE(w)->tp_name, w, Py_TYPE(w)->tp_name);
268270
return -1;
269271
}
270272
drec.dsize = tmp_size;

Modules/_gdbmmodule.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ parse_datum(PyObject *o, datum *d, const char *failmsg)
248248
Py_ssize_t size;
249249
if (!PyArg_Parse(o, "s#", &d->dptr, &size)) {
250250
if (failmsg != NULL) {
251-
PyErr_SetString(PyExc_TypeError, failmsg);
251+
PyErr_Format(PyExc_TypeError, failmsg, Py_TYPE(o)->tp_name, o, Py_TYPE(o)->tp_name);
252252
}
253253
return 0;
254254
}
@@ -324,11 +324,12 @@ static int
324324
gdbm_ass_sub_lock_held(PyObject *op, PyObject *v, PyObject *w)
325325
{
326326
datum krec, drec;
327-
const char *failmsg = "gdbm mappings have bytes or string indices only";
327+
const char *key_failmsg = "dbm key returned %.100s for value %R But database keys must be bytes or str, not %.100s";
328+
const char *value_failmsg = "dbm value returned %.100s for value %R But database keys must be bytes or str, not %.100s";
328329
gdbmobject *dp = _gdbmobject_CAST(op);
329330
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
330331

331-
if (!parse_datum(v, &krec, failmsg)) {
332+
if (!parse_datum(v, &krec, key_failmsg)) {
332333
return -1;
333334
}
334335
if (dp->di_dbm == NULL) {
@@ -349,7 +350,7 @@ gdbm_ass_sub_lock_held(PyObject *op, PyObject *v, PyObject *w)
349350
}
350351
}
351352
else {
352-
if (!parse_datum(w, &drec, failmsg)) {
353+
if (!parse_datum(w, &drec, value_failmsg)) {
353354
return -1;
354355
}
355356
errno = 0;

0 commit comments

Comments
 (0)