each_lineに十分なコンマがない場合、またはいずれかの値が数値ではなかった場合(たとえば、空の文字列)、これが失敗する可能性のある場所がいくつかあります。いずれの場合も、エラーをキャッチしcontinue
て、次の項目にスキップするために使用できf
ます。
for each_line in f:
try:
foo_line, bar_line = each_line.split(',')
except ValueError:
# "Too many/few values to unpack" meaning wrong number of commas!
continue
try:
foo, bar = int(foo_line), int(bar_line)
except ValueError:
# "invalid literal for int()" meaning it wasn't digits
continue
foobar = FooBar(foo,bar)
foobar_list.append(foobar)
失敗する方法は2つあるため、これを2つの別個の例外ハンドラーに分割しました。あなたは実際にそれを次のように折りたたむことができます:
for each_line in f:
try:
foo_line, bar_line = each_line.split(',')
foo, bar = int(foo_line), int(bar_line)
except ValueError:
# there was invalid input.
continue
foobar = FooBar(foo,bar)
foobar_list.append(foobar)
それは同じ例外であり、それらは互いに接近して発生するためです。個人的には、2種類のエラーがあることを明確にするために前者の方が好きです。あなたがしてはいけないことは次のとおりです。
# !!! BAD !!!
for each_line in f:
try:
each_line = each_line.split(',')
foo = int(each_line[0])
bar = int(each_line[1]
foobar = FooBar(foo,bar)
foobar_list.append(foobar)
except ValueError:
continue
FooBar()
または失敗する可能性もありfoobar_list.append()
ますが、例外ハンドラはそれを飲み込む可能性があります。常にtry:
yoru例外ハンドラーのスイートをできるだけ小さくして、1つのエラーのみをキャッチし、エラーが見つけやすい場所にします。