python – specifically handle file exists exception
Question:
I have come across examples in this forum where a specific error around files and directories is handled by testing the errno
value in OSError
(or IOError
these days ?). For example, some discussion here – Python's "open()" throws different errors for "file not found" – how to handle both exceptions?. But, I think, that is not the right way. After all, a FileExistsError
exists specifically to avoid having to worry about errno
.
The following attempt didn’t work as I get an error for the token FileExistsError
.
try:
os.mkdir(folderPath)
except FileExistsError:
print 'Directory not created.'
How do you check for this and similar other errors specifically ?
Answers:
According to the code print ...
, it seems like you’re using Python 2.x. FileExistsError
was added in Python 3.3; You can’t use FileExistsError
.
Use errno.EEXIST
:
import os
import errno
try:
os.mkdir(folderPath)
except OSError as e:
if e.errno == errno.EEXIST:
print('Directory not created.')
else:
raise
Here’s an example of dealing with a race condition when trying to atomically overwrite an existing symlink:
# os.symlink requires that the target does NOT exist.
# Avoid race condition of file creation between mktemp and symlink:
while True:
temp_pathname = tempfile.mktemp()
try:
os.symlink(target, temp_pathname)
break # Success, exit loop
except FileExistsError:
time.sleep(0.001) # Prevent high load in pathological conditions
except:
raise
os.replace(temp_pathname, link_name)
I have come across examples in this forum where a specific error around files and directories is handled by testing the errno
value in OSError
(or IOError
these days ?). For example, some discussion here – Python's "open()" throws different errors for "file not found" – how to handle both exceptions?. But, I think, that is not the right way. After all, a FileExistsError
exists specifically to avoid having to worry about errno
.
The following attempt didn’t work as I get an error for the token FileExistsError
.
try:
os.mkdir(folderPath)
except FileExistsError:
print 'Directory not created.'
How do you check for this and similar other errors specifically ?
According to the code print ...
, it seems like you’re using Python 2.x. FileExistsError
was added in Python 3.3; You can’t use FileExistsError
.
Use errno.EEXIST
:
import os
import errno
try:
os.mkdir(folderPath)
except OSError as e:
if e.errno == errno.EEXIST:
print('Directory not created.')
else:
raise
Here’s an example of dealing with a race condition when trying to atomically overwrite an existing symlink:
# os.symlink requires that the target does NOT exist.
# Avoid race condition of file creation between mktemp and symlink:
while True:
temp_pathname = tempfile.mktemp()
try:
os.symlink(target, temp_pathname)
break # Success, exit loop
except FileExistsError:
time.sleep(0.001) # Prevent high load in pathological conditions
except:
raise
os.replace(temp_pathname, link_name)