我有一个读取CSV的功能,检查行中的值,如果一切正常,则将行写入新的CSV文件。我在主函数中调用了一些验证函数,以检查行的值和格式。

我正在尝试以某种方式实现我的主要功能,以便当我调用其他验证功能并且某些内容未 check out 时,我完全跳过了写该行的过程。

#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),这样我就不会编写引发异常的行了?

最佳答案

您可以通过在raise块的中使用,空 except 语句来重新引发在异常处理程序中捕获的异常,并使另一个调用程序在处理堆栈中进行处理:

except ValueError:
    raise  # re raises the previous exception

这样,“main”中的外部处理程序可以捕获它和continue

注意:照原样,except:循环中的空for块将捕获所有内容。指定期望的异常(在这种情况下为except ValueError)通常被认为是一个好主意。

更简单地说,不要将验证函数divisible_by_5的主体放在try语句中。如果当前异常与指定的异常匹配,Python会自动搜索定义的最近的except块并使用它:
def raiser():
    if False:
        pass
    else:
        raise ValueError

try:
    raiser()
except ValueError:
    print "caught"

这将打印caught

关于python - 从被调用函数中捕获异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34622668/

10-12 17:40
查看更多