通常返回列表的函数是否应该在异常上返回负int?

时间:2016-04-16 14:33:23

标签: python exception-handling

如果我有一个读取文件并返回值列表的函数,但该文件不存在,或者为该进程设置了读取权限,或者任何其他类型的异常,那么最好:

  1. 让异常有机地发生
  2. 尝试/捕获异常并将错误作为字符串打印,并返回-1或其他一些失败的内容
  3. 尝试/捕获异常并且不打印任何内容,但返回-1
  4. 尝试/捕获异常并返回空列表(这是误导性的)
  5. 其他东西
  6. 在这种情况下,如果重要的话我们会谈论Python。

3 个答案:

答案 0 :(得分:2)

答案并非真正针对Python。关于异常的一般规则是,您应该只在可以完成某些操作的环境中捕获它们:例如:每10秒再试一次,最多3次,有意义,或询问用户他们想做什么:重试,中止? 如果捕获异常的函数无法合理恢复,最好让异常“冒泡”。有时,如果捕获异常的上下文可以添加其他有用信息,则可以捕获异常,添加有意义的信息并重新抛出不同的,更有意义的异常。这实际上取决于你想要做什么。 请注意,返回无效值是错误处理的不同范例,在某些情况下它是有意义的,但通常情况下,通过异常可以更好地处理您描述的故障。

答案 1 :(得分:1)

  1. 让异常有机地发生。
  2. 由调用者来决定做什么,所以给调用者提供它需要的信息 - 异常 - 让它决定。传递返回代码只会丢失信息,并且容易引导。

答案 2 :(得分:1)

如果您保证该功能始终能够完全正确处理异常,那么请在函数本身处理异常并且在失败时返回loaddata = function () { if (localStorage.length > 0) { for(var i = 0; i < localStorage.length; i++) { if (localStorage.hasOwnProperty('title_' + i)) { createNewTile( JSON.parse(localStorage.getItem('title_' + i)) ); } } ,因为空列表可能是有效的返回,None比整数返回码更Pythonic。

但是,很可能你无法做出这样的保证,所以你应该允许异常冒泡到调用者。或者您可以通过捕获异常,对其执行某些分析(可能打印警告消息)然后重新引发异常,或者通过附加额外的错误/警告信息来提升它的修改版本来妥协。

这符合古代程序员的谚语:

  

永远不要测试您不知道如何处理的错误情况。

:)