我有一个函数读取CSV,检查行中的值,如果一切正常,它会将行写入新的CSV文件.我在我的main函数中调用了一些验证函数来检查行的值和格式.
我试图以某种方式实现我的main函数,这样当我调用其他验证函数并且某些东西不能检出时,我会完全跳过该行.
#main function for row in reader: try: row['amnt'] = divisible_by_5(row['amnt']) row['issue_d'] = date_to_iso(row['issue_d']) writer.writerow(row) except: continue #Validation function def divisible_by_5(value): try: float_value = float(value) if float_value % 5 == 0 and float_value != 0: return float_value else: raise ValueError except ValueError: return None
目前,作者仍在编写应该跳过的行.例如,如果一个数字不能被5整除,而不是跳过该行,那么编写者就是在写''
.
那么,我如何处理在for循环中ValueError
引发的exception()divisible_by_5
所以我不编写引发异常的行?
您可以重新引发异常处理程序中捕获的异常,并使用调用堆栈中的另一个处理程序通过在块内使用空 raise
语句来处理它:except
except ValueError: raise # re raises the previous exception
这样,'main'中的外部处理程序可以捕获它continue
.
注意:原样,循环中的空except:
块将捕获所有内容.指定预期的异常(在这种情况下)通常被认为是一个好主意. for
except ValueError
更简单地说,不要把你的验证函数体divisible_by_5
中try
的语句.Python会自动搜索最近的定义的块,并在当前异常与指定的异常匹配时使用它:
def raiser(): if False: pass else: raise ValueError try: raiser() except ValueError: print "caught"
这将打印caught
.