微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么例外是可迭代的?

如何解决为什么例外是可迭代的?

请注意,发生的情况与任何类型的隐式字符串转换等均无关,而是因为Exception类实现了__getitem __(),并使用它来返回args元组(ex.args)中的值。您可以通过将整个字符串作为迭代中的第一个也是唯一的项目,而不是遍历字符串而得到的每个字符的结果来看到这一点。

这也让我感到惊讶,但是考虑到这一点,我想这是出于向后兼容的原因。以前(1.5之前的版本)的Python缺少当前类的异常层次结构。相反,将抛出字符串,并使用(通常是)元组参数表示应传递给处理块的任何详细信息。即:

try:
    raise "something Failed", (42, "some other details")
except "something Failed", args:
    errCode, msg = args
    print "something Failed.  error code %d: %s" % (errCode, msg)

这样做似乎是为了避免破坏期望参数为元组的1.5之前的代码,而不是不可迭代的异常对象。上面链接的“致命损坏”部分中有一些使用IOError的示例。

字符串异常已经废弃了一段时间,并且在Python 3中逐渐消失。我现在已经检查了Python 3如何处理异常对象,并且看起来它们在那里不再可迭代:

>>> list(Exception("test"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Exception' object is not iterable

[编辑]检查python3的行为

解决方法

最近,我被意外的事情咬了。我想做这样的事情:

try :
     thing.merge(iterable) # this is an iterable so I add it to the list
except TypeError :
     thing.append(iterable) # this is not iterable,so I add it

好吧,直到我传递了一个应该从Exception继承的对象之前,它一直工作良好。

不幸的是,异常是可迭代的。以下代码不引发任何问题TypeError

for x in Exception() :
    print 1

有人知道为什么吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。