从被调用的函数中捕获异常

时间:2016-01-05 22:48:53

标签: python exception-handling

我有一个读取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),这样我就不会写出引发异常的行?

1 个答案:

答案 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"