[Python-ideas] with statement vs. try...except...finally

Gerald Britton gerald.britton at gmail.com
Fri May 29 22:58:55 CEST 2009


Good point, so can this be translated to a "with" statement:

try:
   f = open('foo')
   try:
       line = f.readline()
       try:
           f.close()
       except IOError:
           line = "can't close"
   except IOError:
     line = "can't read"
except IOError:
   line = "can't open"

??

I guess I'm wondering if we need a with...except construct so that we
can get exceptions that happen after the with context is entered
without wrapping the with statement in try...except.

On Fri, May 29, 2009 at 3:49 PM, Pascal Chambon
<chambon.pascal at wanadoo.fr> wrote:
> Gerald Britton a écrit :
>>
>> I'm wondering if the "with" statement should have exception clauses
>> like the "try" statement, even though this seems to defeat part of the
>> reason for the "with" statement.
>>
>> Currently I have a program segment that opens a file and reads a line,
>> something like this (distilled to its elements for illustration):
>>
>> try:
>>    f = open('foo')
>>    line = f.readline()
>>    f.close()
>> except IOError:
>>    line = 'default'
>>
>> So that I get a default value if anything goes awry whilst reading the
>> file.
>>
>> If I write it using a "with" statement, I might have:
>>
>> line = 'default'
>> with open('foo') as f:
>>   line = f.readline()
>>
>> Fine so far, but what if I want to be more granular?  e.g. with
>> "try...except":
>>
>> try:
>>    f = open('foo')
>> except IOError:
>>    line = "can't open"
>>
>> try:
>>    line = f.readline()
>> except IOError:
>>    line = "can't read"
>>
>> try:
>>    f.close()
>> except IOError:
>>    line = "can't close"
>>
>> I can't see how to replace the above try-triplet with a "with"
>> encapsulation. Or, do I have to wrap the "with" statement in try like
>> this:
>>
>> try:
>>
>>  with open('foo') as f:
>>     line = f.readline()
>>
>> except IOError:
>>  line = 'problem with read or close"
>>
>>
>>
>
> I'd say the triplet of "try...except" clauses above isn't OK, because if the
> file opening fails, teh code will try anyway to read it and to close it,
> leading to nameError and other uncaught exception.
>
> But the last clause, wrapped in try..except, seems fine to me.
>
> ++
> Pascal
>
>
>
>



-- 
Gerald Britton



More information about the Python-ideas mailing list