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。
我应该认为这是内置的ValueError
exception的完美情况。
我同意以上所有。
除了引发exception之外,实际上没有其他的方法可以表明在初始化对象时出了什么问题。
在大多数程序类中,类的状态完全依赖于该类的input,所以我们可能会期望产生某种ValueError或TypeError。
如果(例如)networking设备不可用或无法写入canvas对象,具有副作用的类(例如,执行联网或graphics的类)可能会在init中引发错误。 这听起来很明智,因为通常你想尽快知道故障情况。
在某些情况下,从init提高错误是不可避免的,但是在init中做太多的工作是一种糟糕的风格。 你应该考虑做一个工厂或一个伪工厂 – 一个简单的方法返回设置的对象。