python上关于错误与成功的返回值的最佳实践

发布于 2021-01-29 17:55:17

一般的 ,假设你有一个像下面的方法。

def intersect_two_lists(self, list1, list2):
    if not list1:
        self.trap_error("union_two_lists: list1 must not be empty.")
        return False
    if not list2:
        self.trap_error("union_two_lists: list2 must not be empty.")
        return False
    #http://bytes.com/topic/python/answers/19083-standard
    return filter(lambda x:x in list1,list2)

在发现错误的该特定方法中,在这种情况下,我不想返回空列表,因为这可能是对此特定方法调用的真正答案,我想返回一些内容以指示参数不正确。因此,在这种情况下,如果出错,我将返回False,否则返回一个列表(是否为空)。

我的问题是,在这样的领域中,不仅针对列表,什么是最佳实践?返回我想要的任何内容,并确保将其记录下来以供用户阅读?:-)你们大多数人都在做什么:

  1. 如果成功,您应该返回True或False并发现错误?
  2. 如果成功,您应该返回列表,然后发现错误?
  3. 如果成功,您应该返回文件句柄,而您遇到错误?
  4. 等等
关注者
0
被浏览
41
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    首先,无论做什么都不会返回结果和错误消息。这是处理错误的一种非常糟糕的方法,并且会引起您无尽的头痛。 如果您需要指出错误,则总是引发异常

    除非有必要,否则我通常会避免引发错误。在您的示例中,实际上并不需要抛出错误。将一个空列表与一个非空列表相交不是一个错误。结果只是空列表,这是正确的。但是,假设您要处理其他情况。例如,如果该方法具有非列表类型。在这种情况下,最好提出一个例外。没什么可害怕的。

    我的建议是查看类似功能的Python库,并了解Python如何处理这些特殊情况。例如看一下集合中的交集方法,它往往是宽容的。在这里,我试图将一个空集与一个空列表相交:

    >>> b = []
    >>> a = set()
    >>> a.intersection(b)
    set([])
    
    >>> b = [1, 2]
    >>> a = set([1, 3])
    >>> a.intersection(b)
    set([1])
    

    仅在需要时抛出错误:

    >>> b = 1
    >>> a.intersection(b)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not iterable
    

    当然,在某些情况下,成功或失败返回True或False可能会很好。但是保持一致非常重要。该函数应始终返回相同的类型或结构。具有可以返回列表或布尔值的函数非常令人困惑。或返回相同的类型,但是在发生错误的情况下此值的含义可以不同。

    编辑:

    OP说:

    我想返回一些内容以指示参数不正确。

    没有什么比错误更能说明错误了。如果要指示参数不正确,请使用异常并输入有用的错误消息。在这种情况下返回结果只是令人困惑。在其他情况下,您可能希望指示什么都没有发生,但这不是错误。例如,如果您有一种方法可以从表中删除条目,而请求删除的条目不存在。在这种情况下,在成功或失败时仅返回True或False可能会很好。这取决于应用程序和预期的行为



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看