当前位置:  开发笔记 > 编程语言 > 正文

为什么异常可迭代?

如何解决《为什么异常可迭代?》经验,为你挑选了1个好方法。

我最近被一些意想不到的东西咬了.我想做出类似的东西:

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

有人知道为什么吗?



1> Brian..:

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

这也让我感到惊讶,但考虑到这一点,我猜它是出于向后兼容的原因.曾经使用的Python(1.5之前版本)缺少当前的异常类层次结构.相反,抛出字符串,(通常)一个元组参数,用于应该传递给处理块的任何细节.即:

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 "", line 1, in 
TypeError: 'Exception' object is not iterable

[编辑]检查python3的行为

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有