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