2012-04-12 9 views
1

SO ich eine Textdatei lese, die 2 hat columnntype casting in Python Fehlerbehandlung

foo, bar 

so habe ich so etwas wie

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) 

Nun, manchmal entweder foo oder bar leer ist .. Daher kann nicht typecasted int int. Gibt es einen Weg, dass, wenn etwas, wo foo oder bar ist leer kann ich einfach überspringen diese Funktion

(nicht an foodbar angefügt), aber dann hält die Schleifen stills los gehts ??

Antwort

7

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.

0

Diese Tests, wenn sie leer sind (vorausgesetzt, sie sind Strings):

if not foo or not bar: 
    continue 
+0

'int()' wird immer noch abstürzen, bevor Sie dort ankommen. – Dougal

+1

dann überprüfen Sie dies zuerst, * dann * tun Sie die Umwandlung –

0

Für den Fall, ein Teil hat nur Plätze:

if foo.strip() != "": 
    foo = int(each_line[0]) 
else: 
    ??? 
+0

Diese Bedingung kann auf 'if foo.strip():' verkürzt werden. – Dougal

1

Dies ist ein außergewöhnliches Beispiel für die Ausnahmebehandlung

for each_line in f: 
    each_line = each_line.split(',') 
    try: 
     foo = int(each_line[0]) 
     bar = int(each_line[1] 
     foobar = FooBar(foo,bar) 
     foobar_list.append(foobar) 
    except ValueError: 
     None