Es gibt ein paar Orte, die möglicherweise fehlschlagen könnten, wenn each_line nicht genug hat Kommas oder wenn einer der Werte keine Zahl ist (zB eine leere Zeichenfolge). In jedem Fall können Sie den Fehler fangen und verwenden continue
zum nächsten Punkt in f
zu überspringen:
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)
ich dies in zwei nach unten gebrochen habe, getrennte Handler Ausnahme, weil es zwei verschiedene Möglichkeiten für sie zum Scheitern verurteilt . Sie könnten es tatsächlich falten wie:
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)
Da es die gleiche Ausnahme ist und sie nahe beieinander passieren. Persönlich bevorzuge ich Ersteres, um es wirklich klar zu machen, dass es zwei Arten von Fehlern gibt. Was Sie nicht tun sollten ist:
# !!! 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
weil FooBar()
oder sogar foobar_list.append()
könnte scheitern, aber der Exception-Handler kann es schlucken; Machen Sie die try:
-Suite in Ihren Ausnahmebehandlern immer so klein wie möglich, so dass sie nur einen Fehler erkennen und der Fehler leicht zu finden ist.
'int()' wird immer noch abstürzen, bevor Sie dort ankommen. – Dougal
dann überprüfen Sie dies zuerst, * dann * tun Sie die Umwandlung –