何时会在Python下引发错误?

时间:2017-10-11 08:21:43

标签: python exception-handling

问题与好的和坏的做法有关: 从C编程我习惯在函数的开头检查传递的参数,从而在出现错误时返回错误代码(例如NULL指针)。

在Python中,会自动引发异常,例如,当传递的Queue对象为None或类型错误时,会尝试对此无效队列对象进行操作。像

一样提前检查数据类型是一种好习惯
def foo(queue):
    if issubclass(Queue, arg):
        raise ...
    # ...

或者应该将错误处理留作调用函数的任务,因为那里出了问题?我很想以第一种方式做到这一点,但觉得它可能是错误的。

1 个答案:

答案 0 :(得分:1)

选择哪种方式取决于具体情况,应该是所谓合同的一部分,如“按合同设计”。

上面提到的设计方法使用了一个描述函数满足其合同的隐喻。如果调用者传递某些参数,则该函数必须执行并完全返回该约定中指定的内容。

如果调用者没有根据合同传递值,那么返回调用者意外的值或以任何方式失败都不是函数的错(当然,它不能隐藏任何问题)。

创建软件时,其中一项任务是选择正确的“合同”。可以总结与您的问题相对应的两种方法:

1)合同说:尽力而为。这是通常的方式。该功能更小,更快,更通用,因为它可用于未事先计划的情况。它充分利用了Python的鸭子打字。

2)合同规定:不承担任何风险,采取防御措施,验证投入等,因为有充分的理由这样做。

良好的编码实践很简单:知道你的函数的契约,相应的代码,相应地写(至少)文档字符串。

只有了解合同,您才能确信自己已经完成了良好的编程工作。 (这不包括担心可能的“改进”)