
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@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