使用异常返回异常值:这是一种好的做法吗?

时间:2014-05-12 14:09:25

标签: python exception

使用函数返回大多数时候是没有好的Python实践,而异常返回有用的 引发存储值的异常

我对此感到有点不安,因为异常通常用于表示某种问题,异常的某些属性提供了有关问题的一些细节。在这里,我希望异常实际上意味着“这是一个特殊的结果这个函数”。

使用异常是很诱人的,因为(1)这只在特殊情况下完成,(2)这在Python中很有效(超过if … is not None:…)。另一方面,异常本身并不是任何类型错误的标志,只是异常返回值的载体。

是否有任何官方建议反对使用异常从函数中返回值?

PS :这是一个用例:

  • 对象方法根据新数据更新对象的内部状态(它是一个有限状态自动机)。
  • 在某些时候(通常在获得许多数据点之后),该方法认为必须采取某些操作(在我的情况下:来自对象的某些日期应存储在数据库中,并且对象的状态将重置为初始值状态,它准备好获得更多数据)。

因此,该方法的事件序列是:获取数据,更新状态,获取数据,更新状态,......啊!我们到达了一个特殊的状态,应该存储有关该对象的信息!重置objet的状态并发送相关信息;获取数据,更新状态,获取数据,更新状态,...因此,大多数情况下,该函数更新对象的内部状态,并不返回任何内容。在特殊情况下,它必须发送有关该对象的重要信息。

2 个答案:

答案 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)

第一个对我来说更清楚。