在 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语句用法以及区别