Python try-else
Как предполагается использовать необязательное условие else
оператора try?
Предполагаемое использование состоит в том, чтобы иметь контекст для запуска большего количества кода, если не было исключений, где он должен был обрабатываться.
Этот контекст позволяет избежать случайной обработки ошибок, которые вы не ожидали.
Но важно понимать точные условия, которые вызывают выполнение условия else, потому что return
, continue
и break
могут прервать поток управления до else
.
В итоге
Оператор else
выполняется, если есть нет исключений и если он не прерывается оператором return
, continue
или break
.
В других ответах пропущена последняя часть.
Из документов:
Необязательное предложение else
выполняется, если и когда элемент управления вытекает из
конец предложения try
. *
(добавлен жирный шрифт.) И сноска гласит:
* В настоящее время управление «течет с конца», за исключением случая, когда
исключение или выполнение оператора return
, continue
или break
.
Требуется хотя бы одно предшествующее, кроме пункта ( см. Грамматику ). Так что на самом деле это не «try-else», это «try-кроме-else (окончательно)», с else
(и finally
), необязательным.
Python Tutorial развивает предполагаемое использование:
Оператор try ... Кроме имеет необязательное условие else, которое, когда
настоящее, должны следовать всем, кроме пунктов. Это полезно для кода, который
должен быть выполнен, если предложение try не вызывает исключение. За
Пример:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print 'cannot open', arg
else:
print arg, 'has', len(f.readlines()), 'lines'
f.close()
Использование условия else лучше, чем добавление дополнительного кода в
предложение try, потому что оно позволяет избежать случайного отлова исключения
это не было вызвано кодом, защищенным попыткой ... кроме
заявление.
Пример дифференцирования else
от кода, следующего за блоком try
Если вы обработаете ошибку, блок else
не будет работать. Например:
def handle_error():
try:
raise RuntimeError('oops!')
except RuntimeError as error:
print('handled a RuntimeError, no big deal.')
else:
print('if this prints, we had no error!') # won't print!
print('And now we have left the try block!') # will print!
А теперь
>>> handle_error()
handled a RuntimeError, no big deal.
And now we have left the try block!