我工作的地方有一条规则,禁止使用异常(允许捕获)。如果我有这样的代码
def f1()
if bad_thing_happen():
raise Exception('bad stuff')
...
return something我可以把它改成
def f1()
if bad_thing_happen():
return [-1, None]
...
return [0, something]f1调用者将如下所示
def f1_caller():
code, result = f1(param1)
if code < 0:
return code
actual_work1()
# call f1 again
code, result = f1(param2)
if code < 0:
return code
actual_work2()
...在Python中还有比这更优雅的方式吗?
发布于 2010-10-06 11:42:43
python中的异常并不是要避免的,通常是解决问题的一种直接方法。此外,异常携带大量信息,可以帮助快速定位(通过堆栈跟踪)和识别问题(通过异常类或消息)。
谁想出了这个包罗万象的政策,谁肯定在考虑另一种语言(也许是C++?)抛出异常是一种代价更高的操作(如果您的代码在一台有20年历史的计算机上执行,则会降低性能)。
回答您的问题:另一种方法是返回错误代码。这意味着您正在将函数结果与错误处理混合在一起,这会引发(哈!)这是它自己的问题。然而,返回None通常是指示函数失败的一种完全合理的方式。
发布于 2010-10-06 11:50:34
返回None是相当常见的,并且在概念上工作得很好。如果您期望一个返回值,但没有得到返回值,这是一个很好的指示,表明出现了错误。
另一种可能的方法是,如果您希望返回一个列表(或字典等)。返回一个空的列表或字典。使用if可以很容易地测试这一点,因为在Python语言中,一个空容器的计算结果是False,如果您要遍历它,您可能甚至不需要检查它(这取决于函数失败时您想要做什么)。
当然,这些方法不会告诉您函数失败的原因。因此您可以返回一个异常实例,例如return ValueError("invalid index")。然后,您可以使用isinstance()测试特定的异常(或一般的异常),并打印它们以获得像样的错误消息。(或者,您可以提供一个助手函数来测试返回代码,以查看它是否派生自Exception。)您仍然可以创建自己的Exception子类;您只需返回它们,而不是引发它们。
最后,我将致力于改变这一荒谬的策略,因为异常是Python工作方式的重要组成部分,开销很低,任何使用您的函数的人都会期望异常。
发布于 2010-10-06 11:54:05
您必须使用返回代码。其他替代方法包括可变全局状态(想想C的errno)或传入可变对象(如列表),但在Python中几乎总是希望同时避免这两种情况。也许你可以试着向他们解释exceptions let you write better post-conditions,而不是增加返回值的复杂性,但在其他方面是等效的。
https://stackoverflow.com/questions/3869326
复制相似问题