11

如果我在函数末尾有这样的代码:

try:
    return map(float, result)
except ValueError, e:
    print "error", e

使用 try / except 作为方法的返回部分是否正确?有没有更明智的方法来解决这个问题?

4

3 回答 3

10

保持简单:没有 try 块

我花了一段时间才知道,在 Python 中,函数抛出异常是很自然的。我花了太多精力在问题发生的地方处理这些问题。

如果您只是让异常冒泡,代码可以变得更简单,也更容易维护。这允许在适当的地方检测级别上的问题。

一种选择是:

try:
    return map(float, result)
except ValueError, e:
    print "error", e
    raise

但这会从一些深层功能中引入打印。同样可以通过raisewhich 让上层代码做适当的事情来提供。

在这种情况下,我首选的解决方案如下:

return map(float, result)

如果有问题,不需要到处乱跳,做预期做的事情,并抛出异常。

于 2014-07-14T08:24:38.747 回答
0

如果您在包含 / 子句的return语句的代码块周围使用try/except子句,那么您绝对应该考虑一下如果实际发生异常应该返回什么:

在您的示例中,该函数将简单地返回None。如果这是你想要的,我建议明确添加一个return None喜欢

except ValueError, e:
    print "error", e
    return None

在你的except街区,以明确这一事实。

其他可能性是返回“默认值”(在这种情况下为空映射)或使用“重新引发”异常

except ValueError, e:
    print "error", e
    raise

这取决于函数的使用方式、您期望异常的情况以及您想要选择哪个选项的一般设计。

于 2014-07-14T08:00:26.030 回答
0

就像在有异常的语言中经常出现的情况一样,程序员假设打印错误消息“处理”它。

打印错误消息不会处理任何事情;你不妨把它放在pass那里。这会导致问题,因为代码期望try块完成某事而某事并未发生。

在 Python 中,您应该:

  1. 找出实际上可以处理错误的地方,即故障实际上已得到纠正,或
  2. 让异常展开到顶部并中止程序

让程序异常中止比让它运行并产生不准确的结果要好得多。

所以除非你知道你的代码可以接受一个空列表,否则你不应该返回任何你认为值得尝试块的东西。

于 2014-07-14T08:27:55.393 回答