【问题标题】:Is it correct to use a return statement within a try and except statement?在 try 和 except 语句中使用 return 语句是否正确?
【发布时间】:2014-09-04 01:56:27
【问题描述】:

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

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

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

【问题讨论】:

  • 是的,您可以在return 周围使用try。这里没有足够的上下文来建议一个“更好”的方法。
  • 请注意,您的方法将按原样返回None。更广泛的背景将允许更明智的建议
  • 用简单的英语,如果map() 导致错误,你想在这个函数中发生什么?除了打印错误。你想让函数返回None吗?返回另一个值?在打印错误后允许异常向上传播调用堆栈?

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


【解决方案1】:

保持简单:没有尝试块

我花了一段时间才知道,在 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 块中说明这一事实。

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

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

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

    【讨论】:

    • 如果映射的结果是好的应该有 f.e. [22.99, 44.34] 结果,但如果它错了,最好引发一些异常,但不要停止程序的执行
    【解决方案3】:

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

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

    在 Python 中,您应该:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多