【问题标题】:Catching exception from a called function从被调用函数中捕获异常
【发布时间】:2016-01-05 22:48:52
【问题描述】:

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

我正在尝试以某种方式实现我的 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 循环中处理 divisible_by_5 中引发的异常 (ValueError),这样我就不会编写引发异常的行?

【问题讨论】:

  • 您能否更清楚地了解您所期望的和无效的?问题是什么?

标签: python exception-handling


【解决方案1】:

您可以重新引发异常处理程序中捕获的异常,并让调用堆栈上的另一个处理程序通过使用 raise 语句 inside @ 987654323@块:

except ValueError:
    raise  # re raises the previous exception

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

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


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

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

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

这将打印caught

【讨论】:

  • 看过这个。我看到我没有在 main 函数的 except 行中添加 valueError 。这是唯一的区别吗?
  • 那和你没有重新引发异常的事实;你在divisible_by_5except 中返回None。您应该在 main 中指定 except ValueError 并且 a) 完全删除函数中的 try-except 或 b) 只需将 return None 替换为 raise
  • 对不起。刚刚看到你更新的答案。那完成了工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2021-04-30
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多