有几个地方可能会失败,如果 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)
我将其分解为两个独立的异常处理程序,因为它有两种不同的失败方式。你实际上可以像这样折叠它:
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)
因为这是同一个例外,而且它们发生的很近。就个人而言,我更喜欢前者,以明确指出有两种错误。你不应该做的是:
# !!! 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 异常处理程序中的套件尽可能小,以便它们只捕获一个错误,并且很容易找到错误所在的位置。