当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从被调用的函数中捕获异常》经验,为你挑选了1个好方法。

我有一个函数读取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所以我不编写引发异常的行?



1> Jim Fasaraki..:

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

except ValueError:
    raise  # re raises the previous exception

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

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


更简单地说,不要把你的验证函数体divisible_by_5try的语句.Python会自动搜索最近的定义的块,并在当前异常与指定的异常匹配时使用它:

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

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

这将打印caught.


抱歉.刚看到你更新的答案.这样做了.非常感谢你!
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有