From 6035eb62d5d1367de4adb1c88a1443d292eb73aa Mon Sep 17 00:00:00 2001 From: Cserna Zsolt Date: Tue, 31 Jul 2018 22:52:24 +0200 Subject: [PATCH] bpo-34248: add filename to the error raised in dbm.gnu.open and dbm.ndbm.open Report the filename to the exception when raising error in dbm.gnu.open and db.ndbm.open functions, so it gets printed when the exception is unhandled, and also can be obtained by the filename attribute of the exception object. --- Lib/test/test_dbm_gnu.py | 7 +++++++ Lib/test/test_dbm_ndbm.py | 6 ++++++ .../next/Library/2018-07-31-23-00-09.bpo-34248.5U6wwc.rst | 3 +++ Modules/_dbmmodule.c | 2 +- Modules/_gdbmmodule.c | 2 +- 5 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-07-31-23-00-09.bpo-34248.5U6wwc.rst diff --git a/Lib/test/test_dbm_gnu.py b/Lib/test/test_dbm_gnu.py index c96eff5a319e64f..16b7fe6fac1760e 100644 --- a/Lib/test/test_dbm_gnu.py +++ b/Lib/test/test_dbm_gnu.py @@ -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() diff --git a/Lib/test/test_dbm_ndbm.py b/Lib/test/test_dbm_ndbm.py index 49b88f5cccefc8e..bd411da652e66eb 100644 --- a/Lib/test/test_dbm_ndbm.py +++ b/Lib/test/test_dbm_ndbm.py @@ -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__': diff --git a/Misc/NEWS.d/next/Library/2018-07-31-23-00-09.bpo-34248.5U6wwc.rst b/Misc/NEWS.d/next/Library/2018-07-31-23-00-09.bpo-34248.5U6wwc.rst new file mode 100644 index 000000000000000..55215f60550b55c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-07-31-23-00-09.bpo-34248.5U6wwc.rst @@ -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. diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 65761d83d380f71..081184a0b3224d5 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -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; } diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index 10560040e446b3b..ceb744b99ba80c4 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -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);