从被调用函数中捕获异常

16
我有一个函数,它读取CSV文件,检查行中的值,如果一切正常,就将这些行写入一个新的CSV文件。在我的主函数中,我调用了几个验证函数来检查行的值和格式。我正在尝试以一种方式实现我的主函数,这样当我调用其他验证函数时,如果某些内容不符合要求,我就会跳过完全不写入该行。
#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循环中,我如何处理divisible_by_5引发的异常(ValueError),以便不编写会引发异常的行?


你能具体说明你的期望以及哪些方面出了问题吗?你的问题是什么? - karlson
1个回答

33

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

except ValueError:
    raise  # re raises the previous exception

这样,'main'中的外部处理程序可以捕获它并continue

注意:目前,你的空的except:块将会捕获所有异常。通常情况下,指定期望的异常(在本例中为except ValueError)是一个好习惯。


更简单的方法是不要把验证函数divisible_by_5的主体放在try语句中。Python会自动搜索最近定义的except块,并在当前异常匹配指定的异常时使用它:

def raiser():
    if False: 
        pass
    else:
        raise ValueError

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

这将会打印出caught


1
看了一下,我发现在我的主函数中except行中没有添加'valueError'。这是唯一的区别吗? - Brosef
1
你没有重新引发异常,而是在 divisible_by_5 函数的 except 中返回了 None。你应该在主函数中指定 except ValueError 并且 a) 要么完全删除函数中的 try-except,b) 要么只需将 return None 替换为 raise - Dimitris Fasarakis Hilliard
2
抱歉,刚看到你更新的回答。这很有用。非常感谢! - Brosef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接