Python:在__init__中引发exception是不是很好?

在__init_中引发exception是否被认为是不好的forms? 如果是这样,那么当某些类variables被初始化为None或错误types时,抛出错误的方法是什么?

__init__()__init__()exception绝对没问题。 在构造函数中没有其他好方法来表示错误条件,并且在构build对象的exception中,标准库中有数百个示例。

要提出的错误级别当然取决于你。 如果构造函数传递了一个无效的参数, ValueError是最好的。

确实,在构造函数中指出错误的唯一正确方法是引发exception。 这就是为什么在C ++和其他面向对象的语言中,如果在对象的构造函数中引发exception(意味着对象的初始化不完整),则不会调用析构函数。 在脚本语言(例如Python)中通常不是这种情况。 例如,如果socket.connect()失败,则以下代码将引发AttributeError:

 class NetworkInterface: def __init__(self, address) self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect(address) self.stream = self.socket.makefile() def __del__(self) self.stream.close() self.socket.close() 

原因是在stream属性初始化之前,连接尝试失败之后调用不完整对象的析构函数。 你不应该避免从构造函数中抛出exception,我只是说在Python中编写完全exception安全的代码是很困难的。 一些Python开发人员完全避免使用析构函数,但这是另一个争论的问题。

我没有看到任何理由,它应该是不好的forms。

相反,其中一个exception事件被认为是做得好的,而不是返回错误代码,通常是错误代码不能被构造器返回。 所以至less在像C ++这样的语言中,引发exception是发现错误的唯一方法。

标准库说:

 >>> f = file("notexisting.txt") Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'notexisting.txt' 

另外我真的不明白为什么它应该被认为是不好的forms。

我应该认为这是内置的ValueErrorexception的完美情况。

我同意以上所有。

除了引发exception之外,实际上没有其他的方法可以表明在初始化对象时出了什么问题。

在大多数程序类中,类的状态完全依赖于该类的input,所以我们可能会期望产生某种ValueError或TypeError。

如果(例如)networking设备不可用或无法写入canvas对象,具有副作用的类(例如,执行联网或graphics的类)可能会在init中引发错误。 这听起来很明智,因为通常你想尽快知道故障情况。

在某些情况下,从init提高错误是不可避免的,但是在init中做太多的工作是一种糟糕的风格。 你应该考虑做一个工厂或一个伪工厂 – 一个简单的方法返回设置的对象。