Python:抛出异常还是返回None?

时间:2014-04-25 15:35:00

标签: python error-handling

我希望得到您对两个代码段中的哪一个是处理查找的 pythonic 方式的反馈。

我正在开发XML文件的包装器。我正在加载XML文件,解析它,将内容存储在字典中,然后通过类方法允许访问。

具体来说 - 如果给定的返回没有结果,我应该返回None还是引发(Key)错误?

我有点困惑,因为有些人建议我抛出错误而不是返回空值。他们说处理错误没有更高的水平会更容易和更清楚。

这是代码的简化版本:

class NoResult(KeyError):
    pass



class Wrapper(object): 
    ....

    self.my_dict = {}

    ....

    get_Entity(self, id):
        if id in self.my_dict:
            value = self.my_dict[id]
            return value
        else:
            return None





class Wrapper(object): 

    ....

    self.my_dict = {}

    ....

    get_Entity(self, id):
        if id in self.my_dict:
            value = self.my_dict[id]
            return value
        else:
            throw NoResult

我真的很感激你的想法!

3 个答案:

答案 0 :(得分:4)

后者符合您对标准Python类型的期望,可以简化为:

def get_Entity(self, id):
    return self.my_dict[id]

如果KeyError不在id,则会为您提升self.my_dict。获取错误会告诉调用函数字典中的内容不是 - 静静地返回None会让您稍后会遇到细微的错误(除非您立即检查if val is None,在这种情况下您可以无论如何都使用了try

(另一个版本也可以简化为:

def get_Entity(self, id):
    return self.my_dict.get(id)

)。

答案 1 :(得分:2)

dict已包含2个行为。 (get - > None[] - > KeyError)。

此外,None是dict的有效值:

my_dict = {'key': None}
my_dict['key']
# Returns None

答案 2 :(得分:1)

好的,这将是一个通用的,但看看程序员使用你的库的期望。如果我在XML文件中进行查找,我可能希望得到一个结果。

让我们说我是一个懒惰的程序员,他没有验证你返回给我的东西并尝试使用它。如果你给我一个特殊的无效值,我的代码将会继续运行并且稍后会遇到错误,这对我来说可能并不明显,这是根本原因。

另一方面,如果您在我请求无效值后立即抛出异常,我的程序会立即崩溃,并准确解释出现了什么问题。

如果程序员都对你的库返回的方式进行了仔细的验证,那么任何一种方式都可以正常工作但更懒散(大多数:P)程序员可能不会这样做,因此异常路由将提供最少的惊喜和困惑。作为一个图书馆,你可以避免在可避免的情况下惊讶或混淆你的用户,所以我会选择例外路线。

但是我会很快注意到,如果执行无效查找是库工作流程中的“正常”操作,您可以更合理地期望程序员检查,然后才变得合理。

记住经验法则,当动作实际上异常且令人惊讶时使用异常,否则你可能不需要ymmv。