Bare Excepts

Dave Angel davea at ieee.org
Sun Jan 3 03:35:48 CET 2010


Steven D'Aprano wrote:
> On Sat, 02 Jan 2010 09:40:44 -0800, Aahz wrote:
>
>   
>> OTOH, if you want to do something different depending on whether the
>> file exists, you need to use both approaches:
>>
>> if os.path.exists(fname):
>>     try:
>>         f = open(fname, 'rb')
>>         data = f.read()
>>         f.close()
>>         return data
>>     except IOError:
>>         logger.error("Can't read: %s", fname) return ''
>> else:
>>     try:
>>         f = open(fname, 'wb')
>>         f.write(data)
>>         f.close()
>>     except IOError:
>>         logger.error("Can't write: %s", fname)
>>     return None
>>     
>
> Unfortunately, this is still vulnerable to the same sort of race 
> condition I spoke about.
>
> Even more unfortunately, I don't know that there is any fool-proof way of 
> avoiding such race conditions in general. Particularly the problem of 
> "open this file for writing only if it doesn't already exist".
>   
> <snip>
In Windows, there is  a way to do it.  It's just not exposed to the 
Python built-in function open().  You use the CreateFile() function, 
with /dwCreationDisposition/  of CREATE_NEW.

It's atomic, and fails politely if the file already exists.

No idea if Unix has a similar functionality.

DaveA





More information about the Python-list mailing list