Are the else and finally sections of exception handling redundant? For example, is there any difference between the following two code snippets?
try:
foo = open("foo.txt")
except IOError:
print("error")
else:
print(foo.read())
finally:
print("finished")
and
try:
foo = open("foo.txt")
print(foo.read())
except IOError:
print("error")
print("finished")
More generally, can't the contents of else always be moved into the try, and can't the contents of finally just be moved outside the try/catch block? If so, what is the purpose of else and finally? Is it just to enhance readability?