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

时间:2014-07-14 07:35:07

标签: python methods exception-handling return try-except

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

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

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

3 个答案:

答案 0 :(得分:4)

保持简单:不尝试阻止

我花了一些时间来学习,在Python中很自然,函数会抛出异常。我已经花了太多精力在发生问题的地方处理这些问题。

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

一个选项是:

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

但是这引入了一些深层功能的打印。 raise可以提供相同的功能,让上层代码执行适当的操作。

在此背景下,我的首选解决方案

return map(float, result)

如果出现问题,无需跳舞,做,预期做什么,并抛出异常。

答案 1 :(得分:0)

如果您包含带有return / try子句的except语句的代码块,如果实际发生异常,您肯定应该考虑应该返回的内容:

在您的示例中,该函数将只返回None。如果它是您想要的,我建议明确添加return None之类的

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

except区块中明确说明这一事实。

其他可能性是返回“默认值”(在这种情况下为空地图)或使用

“重新加载”异常
except ValueError, e:
    print "error", e
    raise

这取决于函数的使用方式,在什么情况下您希望例外以及您的一般设计选择哪个选项。

答案 2 :(得分:0)

在具有例外的语言中经常出现这种情况,程序员认为打印错误消息会“处理”它。

打印错误消息无法处理任何事情;你可能会把pass放在那里。这会导致问题,因为代码期望try块可以完成某些操作并且没有发生某些事情。

在Python中,你应该:

  1. 在故障实际纠正的意义上找出错误实际可以处理的位置,或
  2. 让异常展开到顶部并中止程序
  3. 让程序中止异常比运行并产生不准确的结果要好得多。

    因此,除非您知道您的代码可以接受空列表,否则您不应该返回任何您认为应该尝试阻止的内容。