Opening files without closing them
Bryan
belred at gmail.com
Tue Mar 7 21:08:27 EST 2006
Peter Hansen wrote:
> 3c273 wrote:
>> "Robert Kern" <robert.kern at gmail.com> wrote in message
>> news:mailman.2794.1141683892.27775.python-list at python.org...
>>
>>> Paul Rubin wrote:
>>>
>>>> Say that the open is inside the try block. If the file can't be
>>>> opened, then 'open' raises an exception, 'f' doesn't get set, and then
>>>> the 'finally' clause tries to close f. f might have been previously
>>>> bound to some other file (which still has other handles alive) and so
>>>> the wrong file gets closed.
>>> And even if 'f' wasn't bound to anything, you will get a NameError instead
>> of
>>
>>> the exception that you're really interested in seeing.
>>
>> Thanks to both of you. So in order to be thorough, should I be doing:
>> try:
>> f=open('file')
>> except: IOError:
>> print 'doesn't exist'
>> so_something_else_instead()
>>
>> try:
>> contents = f.read()
>> finally:
>> f.close()
>
> Unfortunately, that would still have trouble if the first exception
> handler was executed, since then you'd try read from f, which would fail
> with another exception, and then you'd try to close f, and that would
> probably fail and raise an exception that isn't caught anywhere.
>
> So this is better, though probably excessive in small scripts:
>
> try:
> f = open('file')
> except IOError:
> # do something else
> else:
> try:
> content = f.read()
> finally:
> f.close()
>
> This takes advantage of "else" on try statements, which executes only if
> the except statement is not executed.
>
> -Peter
>
this is what i always do for files and other types of resources:
if it's a low-level routine, i usually let any exceptions bubble up to a higher
level routine that cares or knows what to do.
f = open('file')
try:
# do something
finally:
f.close()
if i really want to handle the exception, then i handle it at a conceptually
"higher" level by wrapping it in an exception which is basically what some
higher-level routine would do anyways.
try:
f = open('file)
try:
# do something
finally:
f.close()
except IOError:
# handle exceptions
bryan
More information about the Python-list
mailing list