Question
Asked By – new name
Is this the right way to use the python “with” statement in combination with a try-except block?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
If it is, then considering the old way of doing things:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
Is the primary benefit of the “with” statement here that we can get rid of three lines of code? It doesn’t seem that compelling to me for this use case (though I understand that the “with” statement has other uses).
EDIT: Is the functionality of the above two blocks of code identical?
EDIT2: The first few answers talk generally about the benefits of using “with”, but those seem of marginal benefit here. We’ve all been (or should have been) explicitly calling f.close() for years. I suppose one benefit is that sloppy coders will benefit from using “with”.
Now we will see solution for issue: Using python “with” statement with try-except block
Answer
- The two code blocks you gave are
not equivalent - The code you described as old way
of doing things has a serious bug:
in case opening the file fails you
will get a second exception in the
finally
clause becausef
is not
bound.
The equivalent old style code would be:
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
As you can see, the with
statement can make things less error prone. In newer versions of Python (2.7, 3.1), you can also combine multiple expressions in one with
statement. For example:
with open("input", "r") as inp, open("output", "w") as out:
out.write(inp.read())
Besides that, I personally regard it as bad habit to catch any exception as early as possible. This is not the purpose of exceptions. If the IO function that can fail is part of a more complicated operation, in most cases the IOError should abort the whole operation and so be handled at an outer level. Using with
statements, you can get rid of all these try...finally
statements at inner levels.
This question is answered By – Bernd Petersohn
This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0