Почему для аргумента try в python требуется else?

В Python оператор try поддерживает предложение else, которое выполняется, если код в блоке try не вызывает исключение. Например:

try:
  f = open('foo', 'r')
except IOError as e:
  error_log.write('Unable to open foo : %s\n' % e)
else:
  data = f.read()
  f.close()

Почему требуется условие else? Не можем ли мы написать приведенный выше код следующим образом:

try:
  f = open('foo', 'r')
  data = f.read()
  f.close()
except IOError as e:
  error_log.write('Unable to open foo : %s\n' % e)

Не будет ли выполнение выполняться до data = f.read(), если open не вызывает исключение?

Ответ 1

Разница в том, что произойдет, если вы получите ошибку в коде f.read() или f.close(). В этом случае:

try:
  f = open('foo', 'r')
  data = f.read()
  f.close()
except IOError as e:
  error_log.write('Unable to open foo : %s\n' % e)

Ошибка в f.read() или f.close() в этом случае даст вам сообщение журнала "Unable to open foo", что явно неверно.

В этом случае этого избежать:

try:
  f = open('foo', 'r')
except IOError as e:
  error_log.write('Unable to open foo : %s\n' % e)
else:
  data = f.read()
  f.close()

И ошибка при чтении или закрытии не приведет к записи журнала, но ошибка будет нарастать вверх в стеке вызовов.

Ответ 2

else используется для кода, который должен выполняться, если предложение try не вызывает исключение.

Использование else лучше, чем дополнительное предложение try, потому что else позволяет избежать случайного обнаружения исключения, которое не было вызвано кодом, защищенным оператором try except.

Ответ 3

По моему мнению, предложение else заключается в том, чтобы ограничить область действия блока try кодом, которым вы пытаетесь управлять исключениями. В качестве альтернативы ваши блоки try больше, и вы можете поймать исключения, которые вы не намерены ловить.

Ответ 4

@John:
Я думаю, что в таких языках, как Java или другие, у вас есть разные исключения. Например, что-то вроде FileNotFound Exception (или что-то вроде этого, я не уверен в имени).
Таким образом, вы можете обрабатывать различные исключения и действовать соответственно. Тогда вы знаете, почему произошла ошибка, из-за открытия или закрытия.