使用函数返回大多数时候是没有好的Python实践,而异常返回有用的值 引发存储值的异常
我对此感到有点不安,因为异常通常用于表示某种问题,异常的某些属性提供了有关问题的一些细节。在这里,我希望异常实际上意味着“这是一个特殊的结果这个函数”。
使用异常是很诱人的,因为(1)这只在特殊情况下完成,(2)这在Python中很有效(超过if … is not None:…
)。另一方面,异常本身并不是任何类型错误的标志,只是异常返回值的载体。
是否有任何官方建议反对使用异常从函数中返回值?
PS :这是一个用例:
因此,该方法的事件序列是:获取数据,更新状态,获取数据,更新状态,......啊!我们到达了一个特殊的状态,应该存储有关该对象的信息!重置objet的状态并发送相关信息;获取数据,更新状态,获取数据,更新状态,...因此,大多数情况下,该函数更新对象的内部状态,并不返回任何内容。在特殊情况下,它必须发送有关该对象的重要信息。
答案 0 :(得分:3)
异常可以将任何异常建模为正常的代码流。错误是最常见的用例,但 normal 返回类型的任何内容都没有意义,可以被视为提出异常的机会。
为非错误用例提出异常完全正常,如果它简化了您的流程。
请记住,引发并捕获的Exception
对象本身就是一个值。将信息附加到该信息是一种完全可接受的方法,用于与呼叫者通信以表示与“正常”的偏差。
我更喜欢像None
这样的标记值的异常;它使处理变得明确,并且当他们忘记处理异常的返回值时,实际上可以导致更清晰的处理和更好的反馈给开发人员。如果你的代码通常会返回一个列表,但是在特定的特殊情况下,你返回None
,并且调用者没有处理它,那么你会在某处发现奇怪的错误。 TypeError: 'NoneType' object is not iterable
比明确的未处理异常更加神秘。
答案 1 :(得分:1)
在出现结果的特殊情况下,您通常是否希望在通话时处理结果?在这种情况下,例外是不必要的;只需返回值。在通话时,差异是:
result = yourFunction()
if result is not None:
handleExceptionalResult(result)
与
try:
yourFunction()
except ExceptionalResult as result:
handleExceptionalResult(result)
第一个对我来说更清楚。