我有一个读取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
中引发的异常(divisible_by_5
),这样我就不会写出引发异常的行?
答案 0 :(得分:8)
您可以重新引发异常处理程序中捕获的异常并让调用堆栈中的另一个处理程序使用空 raise
语句来处理它 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/flot/flot/master/jquery.flot.js"></script>
<script src="https://rawgit.com/Codicode/flotanimator/master/jquery.flot.animator.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.time.js"></script>
<div id="chart1" style="width: 540px; height: 250px;">
块:
except
这样,外部处理程序在&#39; main&#39;可以抓住它并except ValueError:
raise # re raises the previous exception
。
注意:按原样,continue
循环中的空except:
块将捕获所有内容。指定预期的异常(在这种情况下为for
)通常被认为是个好主意。
更简单地,不要将验证函数except ValueError
的正文放在divisible_by_5
声明中。 Python会自动搜索最接近的定义的块,并在当前异常与指定的异常匹配时使用它:
try
这将打印def raiser():
if False:
pass
else:
raise ValueError
try:
raiser()
except ValueError:
print "caught"
。