Skip to content

Commit 9df346b

Browse files
csernazsberkerpeksag
authored andcommitted
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.
1 parent 59ee5b1 commit 9df346b

File tree

5 files changed

+18
-2
lines changed

5 files changed

+18
-2
lines changed

Lib/test/test_dbm_gnu.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,13 @@ def test_nonascii_filename(self):
144144
self.assertTrue(b'key' in db)
145145
self.assertEqual(db[b'key'], b'value')
146146

147+
def test_nonexisting_file(self):
148+
nonexisting_file = 'nonexisting-file'
149+
with self.assertRaises(gdbm.error) as cm:
150+
gdbm.open(nonexisting_file)
151+
self.assertIn(nonexisting_file, str(cm.exception))
152+
self.assertEqual(cm.exception.filename, nonexisting_file)
153+
147154

148155
if __name__ == '__main__':
149156
unittest.main()

Lib/test/test_dbm_ndbm.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ def test_nonascii_filename(self):
105105
self.assertTrue(b'key' in db)
106106
self.assertEqual(db[b'key'], b'value')
107107

108+
def test_nonexisting_file(self):
109+
nonexisting_file = 'nonexisting-file'
110+
with self.assertRaises(dbm.ndbm.error) as cm:
111+
dbm.ndbm.open(nonexisting_file)
112+
self.assertIn(nonexisting_file, str(cm.exception))
113+
self.assertEqual(cm.exception.filename, nonexisting_file)
108114

109115

110116
if __name__ == '__main__':
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Report filename in the exception raised when the database file cannot be opened
2+
by :func:`dbm.gnu.open` and :func:`dbm.ndbm.open` due to OS-related error.
3+
Patch by Zsolt Cserna.

Modules/_dbmmodule.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ newdbmobject(const char *file, int flags, int mode)
6262
dp->di_size = -1;
6363
/* See issue #19296 */
6464
if ( (dp->di_dbm = dbm_open((char *)file, flags, mode)) == 0 ) {
65-
PyErr_SetFromErrno(DbmError);
65+
PyErr_SetFromErrnoWithFilename(DbmError, file);
6666
Py_DECREF(dp);
6767
return NULL;
6868
}

Modules/_gdbmmodule.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ newdbmobject(const char *file, int flags, int mode)
7575
errno = 0;
7676
if ((dp->di_dbm = gdbm_open((char *)file, 0, flags, mode, NULL)) == 0) {
7777
if (errno != 0)
78-
PyErr_SetFromErrno(DbmError);
78+
PyErr_SetFromErrnoWithFilename(DbmError, file);
7979
else
8080
PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
8181
Py_DECREF(dp);

0 commit comments

Comments
 (0)