就良好的Python风格而言,使用ValueError返回默认值是否可以接受?

就良好的Python风格而言,使用ValueError返回默认值是否可以接受?,python,exception,coding-style,Python,Exception,Coding Style,我来自Java背景,目前正在学习Python,我在一本Python初学者书中找到了这个示例。它建议在类似电子表格的计算函数中使用ValueError异常,以返回空单元格的0,如下所示: def cell_value(string): try: return float(string) except ValueError: if string == "": return 0 else: return None 现在,据我所知,在Java世界

我来自Java背景,目前正在学习Python,我在一本Python初学者书中找到了这个示例。它建议在类似电子表格的计算函数中使用
ValueError
异常,以返回空单元格的
0
,如下所示:

def cell_value(string):
  try:
    return float(string)
  except ValueError:
    if string == "":
      return 0
    else:
      return None
现在,据我所知,在Java世界中,这样使用异常是不受欢迎的,因为在电子表格中有一个空单元格并将其解释为
0
,显然不是一种例外情况,而是Java中的正常程序流“例外情况,顾名思义,仅用于例外情况;它们永远不应该用于普通的控制流。”(约书亚·布洛赫:有效的Java)

我已经读过另一篇文章,其中建议在Python世界中可能不会严格遵守此规则,但我仍然不确定给定的示例


上述函数中所示的
ValueError
的使用在Python中是否被视为不好的做法?

这是否是一种不好的做法取决于上下文imho。您如何处理所有这些单元格值?例如,如果您将它们添加在一起,这种方法将是“ok”“。可能在强制转换之前将
if string==”
移动到
float
会更有意义,但是在强制转换周围仍然需要try-catch块,不同之处在于
except
分支只返回
None
Agree@GPhilo,如果不是字符串:也足以测试空字符串;在Python中,EAFP比LBYL更受鼓励是的,我想没有什么好的理由将空字符串测试放在except块而不是try块中。如果在try块中,except块只处理真正的异常情况。有道理,谢谢@另一个节点我认为空字符串测试应该完全在try-except子句之外,即在try之前,您不希望空字符串测试引发ValueError