From ddf2e953c27d529b7e321c972ede2afce5dfb0b0 Mon Sep 17 00:00:00 2001 From: Ronan Pigott Date: Tue, 19 Sep 2023 16:18:23 -0700 Subject: [PATCH] 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. --- Lib/test/test_os.py | 7 +++++++ .../2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst | 2 ++ Modules/posixmodule.c | 9 ++------- 3 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 34cd27b143f231..66aece2c4b3eb9 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -913,6 +913,13 @@ def set_time(filename): os.utime(self.fname, None) 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): if sys.platform == 'win32': root = os.path.splitdrive(os.path.abspath(path))[0] + '\\' diff --git a/Misc/NEWS.d/next/Library/2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst b/Misc/NEWS.d/next/Library/2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst new file mode 100644 index 00000000000000..15ec0b437d4339 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst @@ -0,0 +1,2 @@ +Exceptions raised by os.utime builtin function now include the related +filename diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index c4340397fbe577..2c89a68fa57f2e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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); } if (!SetFileTime(hFile, NULL, &atime, &mtime)) { - /* Avoid putting the file name into the error here, - 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); + path_error(path); CloseHandle(hFile); return NULL; } @@ -6351,8 +6347,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, #endif if (result < 0) { - /* see previous comment about not putting filename in error here */ - posix_error(); + path_error(path); return NULL; }