gh-109033: Return filename with os.utime errors (#109034)

The filename was previously intentionally omitted from exception because
"it might confuse the user". Uncaught exceptions are not generally a
replacement for user-facing error messages, so obscuring this
information only has the effect of making the programmer's life more
difficult.
This commit is contained in:
Ronan Pigott 2023-09-19 16:18:23 -07:00 committed by GitHub
parent fd7e08a6f3
commit ddf2e953c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 7 deletions

View file

@ -913,6 +913,13 @@ class UtimeTests(unittest.TestCase):
os.utime(self.fname, None) os.utime(self.fname, None)
self._test_utime_current(set_time) self._test_utime_current(set_time)
def test_utime_nonexistent(self):
now = time.time()
filename = 'nonexistent'
with self.assertRaises(FileNotFoundError) as cm:
os.utime(filename, (now, now))
self.assertEqual(cm.exception.filename, filename)
def get_file_system(self, path): def get_file_system(self, path):
if sys.platform == 'win32': if sys.platform == 'win32':
root = os.path.splitdrive(os.path.abspath(path))[0] + '\\' root = os.path.splitdrive(os.path.abspath(path))[0] + '\\'

View file

@ -0,0 +1,2 @@
Exceptions raised by os.utime builtin function now include the related
filename

View file

@ -6307,11 +6307,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
_Py_time_t_to_FILE_TIME(utime.mtime_s, utime.mtime_ns, &mtime); _Py_time_t_to_FILE_TIME(utime.mtime_s, utime.mtime_ns, &mtime);
} }
if (!SetFileTime(hFile, NULL, &atime, &mtime)) { if (!SetFileTime(hFile, NULL, &atime, &mtime)) {
/* Avoid putting the file name into the error here, path_error(path);
as that may confuse the user into believing that
something is wrong with the file, when it also
could be the time stamp that gives a problem. */
PyErr_SetFromWindowsErr(0);
CloseHandle(hFile); CloseHandle(hFile);
return NULL; return NULL;
} }
@ -6351,8 +6347,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
#endif #endif
if (result < 0) { if (result < 0) {
/* see previous comment about not putting filename in error here */ path_error(path);
posix_error();
return NULL; return NULL;
} }