From 9df346bf98069a87de14a3c2f69009d800994c63 Mon Sep 17 00:00:00 2001 From: Zsolt Cserna Date: Thu, 27 Sep 2018 21:54:34 +0200 Subject: [PATCH] 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. --- 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 c96eff5a31..16b7fe6fac 100644 --- a/Lib/test/test_dbm_gnu.py +++ b/Lib/test/test_dbm_gnu.py @@ -144,6 +144,13 @@ class TestGdbm(unittest.TestCase): 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 49b88f5ccc..bd411da652 100644 --- a/Lib/test/test_dbm_ndbm.py +++ b/Lib/test/test_dbm_ndbm.py @@ -105,6 +105,12 @@ class DbmTestCase(unittest.TestCase): 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 0000000000..55215f6055 --- /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 65761d83d3..081184a0b3 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 10560040e4..ceb744b99b 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); -- 2.40.0