在__init__
中引发异常被认为是不好的形式吗?如果是这样,那么当某些类变量被初始化为None
或类型不正确时,抛出错误的可接受方法是什么?
发布于 2009-10-01 23:59:27
在__init__()
中引发异常是完全可以的。没有其他好的方法来指示初始化器中的错误条件,并且在标准库中有数百个初始化对象可能引发异常的示例。
当然,要引发的error类取决于您。如果向初始值设定项传递了无效参数,则最好使用ValueError
。
发布于 2011-09-21 22:04:03
的确,在构造函数中指示错误的唯一正确方法是引发异常。这就是为什么在C++和其他在设计时考虑到异常安全的面向对象语言中,如果在对象的构造函数中抛出异常(这意味着对象的初始化不完整),就不会调用析构函数。在脚本语言中通常不是这样,比如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()
原因是在连接尝试失败之后,在初始化流属性之前调用不完整对象的析构函数。你不应该避免从构造函数中抛出异常,我只是说用Python编写完全异常安全的代码是很困难的。一些Python开发人员完全避免使用析构函数,但这是另一个争论的问题。
发布于 2009-10-01 23:58:14
标准库说:
>>> 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'
此外,我真的看不出有任何理由认为这是不好的形式。
https://stackoverflow.com/questions/1507082
复制相似问题