如果我在函数末尾有这样的代码:
try:
return map(float, result)
except ValueError, e:
print "error", e
使用 try / except 作为方法的返回部分是否正确?有没有更明智的方法来解决这个问题?
如果我在函数末尾有这样的代码:
try:
return map(float, result)
except ValueError, e:
print "error", e
使用 try / except 作为方法的返回部分是否正确?有没有更明智的方法来解决这个问题?
我花了一段时间才知道,在 Python 中,函数抛出异常是很自然的。我花了太多精力在问题发生的地方处理这些问题。
如果您只是让异常冒泡,代码可以变得更简单,也更容易维护。这允许在适当的地方检测级别上的问题。
一种选择是:
try:
return map(float, result)
except ValueError, e:
print "error", e
raise
但这会从一些深层功能中引入打印。同样可以通过raise
which 让上层代码做适当的事情来提供。
在这种情况下,我首选的解决方案如下:
return map(float, result)
如果有问题,不需要到处乱跳,做预期做的事情,并抛出异常。
如果您在包含 / 子句的return
语句的代码块周围使用try
/except
子句,那么您绝对应该考虑一下如果实际发生异常应该返回什么:
在您的示例中,该函数将简单地返回None
。如果这是你想要的,我建议明确添加一个return None
喜欢
except ValueError, e:
print "error", e
return None
在你的except
街区,以明确这一事实。
其他可能性是返回“默认值”(在这种情况下为空映射)或使用“重新引发”异常
except ValueError, e:
print "error", e
raise
这取决于函数的使用方式、您期望异常的情况以及您想要选择哪个选项的一般设计。
就像在有异常的语言中经常出现的情况一样,程序员假设打印错误消息“处理”它。
打印错误消息不会处理任何事情;你不妨把它放在pass
那里。这会导致问题,因为代码期望try
块完成某事而某事并未发生。
在 Python 中,您应该:
让程序异常中止比让它运行并产生不准确的结果要好得多。
所以除非你知道你的代码可以接受一个空列表,否则你不应该返回任何你认为值得尝试块的东西。