bpo-34248: Add filename to error raised in {gnu,ndbm}.open() (GH-8590)

Report the filename to the exception when raising {gdbm,dbm.ndbm}.error in
dbm.gnu.open() and dbm.ndbm.open() functions, so it gets printed when the
exception is raised, and can also be obtained by the filename attribute of the
exception object.
This commit is contained in:
Zsolt Cserna 2018-09-27 21:54:34 +02:00 committed by Berker Peksag
parent 59ee5b1293
commit 9df346bf98
5 changed files with 18 additions and 2 deletions

View file

@ -144,6 +144,13 @@ def test_nonascii_filename(self):
self.assertTrue(b'key' in db)
self.assertEqual(db[b'key'], b'value')
def test_nonexisting_file(self):
nonexisting_file = 'nonexisting-file'
with self.assertRaises(gdbm.error) as cm:
gdbm.open(nonexisting_file)
self.assertIn(nonexisting_file, str(cm.exception))
self.assertEqual(cm.exception.filename, nonexisting_file)
if __name__ == '__main__':
unittest.main()

View file

@ -105,6 +105,12 @@ def test_nonascii_filename(self):
self.assertTrue(b'key' in db)
self.assertEqual(db[b'key'], b'value')
def test_nonexisting_file(self):
nonexisting_file = 'nonexisting-file'
with self.assertRaises(dbm.ndbm.error) as cm:
dbm.ndbm.open(nonexisting_file)
self.assertIn(nonexisting_file, str(cm.exception))
self.assertEqual(cm.exception.filename, nonexisting_file)
if __name__ == '__main__':

View file

@ -0,0 +1,3 @@
Report filename in the exception raised when the database file cannot be opened
by :func:`dbm.gnu.open` and :func:`dbm.ndbm.open` due to OS-related error.
Patch by Zsolt Cserna.

View file

@ -62,7 +62,7 @@ newdbmobject(const char *file, int flags, int mode)
dp->di_size = -1;
/* See issue #19296 */
if ( (dp->di_dbm = dbm_open((char *)file, flags, mode)) == 0 ) {
PyErr_SetFromErrno(DbmError);
PyErr_SetFromErrnoWithFilename(DbmError, file);
Py_DECREF(dp);
return NULL;
}

View file

@ -75,7 +75,7 @@ newdbmobject(const char *file, int flags, int mode)
errno = 0;
if ((dp->di_dbm = gdbm_open((char *)file, 0, flags, mode, NULL)) == 0) {
if (errno != 0)
PyErr_SetFromErrno(DbmError);
PyErr_SetFromErrnoWithFilename(DbmError, file);
else
PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
Py_DECREF(dp);