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

Posted

技术标签:

【中文标题】在 try 和 except 语句中使用 return 语句是不是正确?【英文标题】: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吗?返回另一个值?在打印错误后允许异常向上传播调用堆栈? 【参考方案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 中,您应该:

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

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

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

【讨论】:

以上是关于在 try 和 except 语句中使用 return 语句是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

delphi异常捕获try except语句 和 try finally语句用法

Python入门教程第53篇 异常处理之try…except…finally

delphi try except语句 和 try finally语句用法以及区别

delphi try except语句 和 try finally语句用法以及区别

python特别的一点:try语句

python错误