python上关于错误与成功的返回值的最佳实践
在 一般的 ,假设你有一个像下面的方法。
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,否则返回一个列表(是否为空)。
我的问题是,在这样的领域中,不仅针对列表,什么是最佳实践?返回我想要的任何内容,并确保将其记录下来以供用户阅读?:-)你们大多数人都在做什么:
- 如果成功,您应该返回True或False并发现错误?
- 如果成功,您应该返回列表,然后发现错误?
- 如果成功,您应该返回文件句柄,而您遇到错误?
- 等等
-
首先,无论做什么都不会返回结果和错误消息。这是处理错误的一种非常糟糕的方法,并且会引起您无尽的头痛。 如果您需要指出错误,则总是引发异常 。
除非有必要,否则我通常会避免引发错误。在您的示例中,实际上并不需要抛出错误。将一个空列表与一个非空列表相交不是一个错误。结果只是空列表,这是正确的。但是,假设您要处理其他情况。例如,如果该方法具有非列表类型。在这种情况下,最好提出一个例外。没什么可害怕的。
我的建议是查看类似功能的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可能会很好。这取决于应用程序和预期的行为