在try和except语句中使用return语句是否正确?

14

如果我的函数有以下代码:

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

在方法的返回部分使用try/except是正确的吗?是否有更明智的解决方法?


7
可以在return周围使用try。这里没有足够的上下文来建议更好的方法。 - Martijn Pieters
4
请注意,按照您的方法将返回None。提供更广泛的上下文将有助于提出更明智的建议。 - Korem
以简单易懂的语言来说,如果 map() 函数出现错误,您希望在此函数中发生什么?除了打印错误之外。您想让函数返回 None 吗?返回另一个值?在打印错误后允许异常向上传播到调用堆栈? - Andrew Gorcester
3个回答

12

保持简单: 不要使用try块

我花了一段时间才学会,在Python中,函数抛出异常是很自然的。我曾经在问题发生的地方处理这些问题,但这样做耗费了我太多精力。

如果您只是让异常传递上来,代码可以变得更简单、更易于维护。这样可以在适当的级别检测问题。

一个选项是:

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

但这会在一些深层函数中引入打印。相同的功能可以通过raise实现,让上一级代码执行适当的操作。

在这种情况下,我更喜欢的解决方案是:

return map(float, result)

不需要绕来绕去,做该做的事情,如果有问题就抛出异常。


2
如果您将包含return语句的代码块用try/except子句包围起来,那么当实际出现异常时,您应该考虑返回什么:
在您的示例中,该函数将简单地返回None。如果这正是您想要的,我建议明确添加一个return None
except ValueError, e:
    print "error", e
    return None

在您的except块中注明这一事实。
其他可能性是返回“默认值”(在本例中为空映射),或者使用“reraise”异常。
except ValueError, e:
    print "error", e
    raise

这取决于函数的使用方式,期望出现什么异常情况以及您的整体设计,您需要选择哪个选项。


如果映射的结果很好,那么结果中应该有例如[22.99,44.34],但如果出现错误,最好引发一些异常,而不是停止程序的执行。 - smith

0
通常在存在异常的语言中,程序员会认为打印错误信息就可以“处理”它。
打印错误消息并不能解决任何问题; 你也可以在那里放置pass。这会引起问题,因为代码期望try块要完成某些事情,而这件事并没有发生。
在Python中,你应该:
  1. 找出错误实际上可以在哪里处理,以使故障得到实际纠正,或者
  2. 让异常展开到顶部并终止程序
使用异常使程序终止要比使其运行并产生不准确的结果好得多。
因此,除非你知道你的代码可以接受一个空列表,否则不应返回你认为需要尝试块来解决的任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接