首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:在__init__中引发异常是不好的形式吗?

Python:在__init__中引发异常是不好的形式吗?
EN

Stack Overflow用户
提问于 2009-10-01 23:47:39
回答 6查看 62.8K关注 0票数 151

__init__中引发异常被认为是不好的形式吗?如果是这样,那么当某些类变量被初始化为None或类型不正确时,抛出错误的可接受方法是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-10-01 23:59:27

__init__()中引发异常是完全可以的。没有其他好的方法来指示初始化器中的错误条件,并且在标准库中有数百个初始化对象可能引发异常的示例。

当然,要引发的error类取决于您。如果向初始值设定项传递了无效参数,则最好使用ValueError

票数 186
EN

Stack Overflow用户

发布于 2011-09-21 22:04:03

的确,在构造函数中指示错误的唯一正确方法是引发异常。这就是为什么在C++和其他在设计时考虑到异常安全的面向对象语言中,如果在对象的构造函数中抛出异常(这意味着对象的初始化不完整),就不会调用析构函数。在脚本语言中通常不是这样,比如Python。例如,如果socket.connect()失败,下面的代码将引发AttributeError:

代码语言:javascript
复制
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开发人员完全避免使用析构函数,但这是另一个争论的问题。

票数 32
EN

Stack Overflow用户

发布于 2009-10-01 23:58:14

标准库说:

代码语言:javascript
复制
>>> 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'

此外,我真的看不出有任何理由认为这是不好的形式。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1507082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档