Почему для аргумента 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 (или что-то вроде этого, я не уверен в имени).
Таким образом, вы можете обрабатывать различные исключения и действовать соответственно. Тогда вы знаете, почему произошла ошибка, из-за открытия или закрытия.