を使用しているために例外が発生してから飲み込まれる可能性は強力な議論ですが、またはの代わり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
。現在の反復も中止されますが、唯一の違いは、1回の反復で終わることです。
それで、「なぜcontinue
許可されないのfinally
ですか?」という質問があります。「なぜ許可されているのか」break
と尋ねることもできます。return
たぶん、その時点でそうしないことが理にかなっているからですか?それは開発者の決定でしたが、今はそうですか?確かに、それは実装者の怠惰かもしれませんが、おそらく彼らは何かを念頭に置いていたのかもしれませんし、Pythonの別のバージョンでは、別の方法でそれを持っている方が理にかなっていますか?
ここでの例は極端なものであるという考え方です。そのようなコードを書くだけではありませんか?finally
ブロックには、いつ、何でも言うためのロジックが必ずあり、break/return/continue
そのように鈍くするだけではありません。そのため、この制限のコード回避策にcontinue
頼るのではなく、必要に応じてinfinally
を使用してクリーンなコードを記述していただければ幸いです(つまり、Pythonの哲学では「私たちはすべてここで大人に同意しています」 )。continue
finally