python错误处理中的类型转换

Moh*_*hit 1 python file-io

所以我正在阅读一个有2列的文本文件

 foo, bar
Run Code Online (Sandbox Code Playgroud)

所以我做了类似的事情

for each_line in f:
   each_line = each_line.split(',')
   foo = int(each_line[0])
   bar = int(each_line[1]
   foobar = FooBar(foo,bar)
   foobar_list.append(foobar)
Run Code Online (Sandbox Code Playgroud)

现在,有时foo或bar都是空白的...因此无法对int进行类型转换..有没有办法,如果foo或bar为空的东西我可以跳过这个功能

(并没有附加到foodbar)但是然后循环静止不动?

Sin*_*ion 7

如果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)
Run Code Online (Sandbox Code Playgroud)

我已将其分解为两个独立的异常处理程序,因为它有两种不同的失败方式.你实际上可以折叠起来像:

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)
Run Code Online (Sandbox Code Playgroud)

因为它是相同的例外,它们紧密相连.就个人而言,我更喜欢前者,因为它确实存在两种错误.你不应该做的是:

# !!! 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
Run Code Online (Sandbox Code Playgroud)

因为FooBar()甚至foobar_list.append()可能会失败,但异常处理程序可以吞下它; 始终使try:yoru异常处理程序中的套件尽可能小,以便它们只捕获一个错误,并且容易找到错误.