Возможность получить исключение, а затем просто проглотить, потому что вы используете continue
, является сильным аргументом, но исключение также проглатывается, когда вы вместо этого используете break
или return
.
Например, это работает, и исключение проглатывается:
for i in range(10):
print i
try:
raise Exception
finally:
break
print i # not gonna happen
Это снова работает без ошибок (в функции), и исключение также проглатывается:
for i in range(10):
print i
try:
raise Exception
finally:
return
print i # not gonna happen
Так почему бы break
и return
быть разрешенными в блоке finally
с возможными ошибками или без них, но continue
нет?
Вы можете также рассмотреть комбинацию следующих факторов впроблема:
finally
всегда выполняется; continue
«прерывает» текущую итерацию.
Это будет означать, что внутри каждогоцикл, потому что finally
всегда выполняется, у вас всегда будет continue
ведьма, которая в основном говорит "прервать текущую итерацию", "отменить текущую итерацию", "отменить текущую итерацию" ... ведьма не имеет никакого смысла,Но не имеет смысла использовать break
и return
.Текущая итерация также прерывается с той лишь разницей, что теперь у вас есть только одна итерация.
Так что вопрос "Почему continue
не разрешен в finally
?"также может быть задан вопрос «Почему разрешено break
и return
?».
Может быть, потому, что на тот момент имело смысл не делать этого? Это было решение разработчиков, и теперь оно такое, как есть? Конечно, это также может быть лень разработчика, но кто знает, может, они что-то имели в виду и, возможно, в другой версии Python это будет иметь больше смыслапо-другому?
Идея в том, что примеры здесь просто экстремальные .Вы не просто пишете такой код, не так ли?В блоке finally
наверняка есть какая-то логика, чтобы сказать, когда нужно break/return/continue
, что угодно, а не просто так тупо.Поэтому IMHO continue
внутри finally
должно быть разрешено, потому что я был бы признателен за написание чистого кода с использованием continue
в finally
, если это то, что мне нужно, вместо того, чтобы прибегать к обходному решению для этого ограничения (т.е.в философии Python «Мы все здесь взрослые по обоюдному согласию»).