如何确定Python类型错误的原因

如何确定Python类型错误的原因,python,exception-handling,try-catch,Python,Exception Handling,Try Catch,我目前正在使用一个try/except块,在可能的情况下将某个特定变量视为可iterable,但在不可iterable时,用一种不同的、尽管正确的方式处理它 我的问题是,抛出TypeException的原因可能不是试图使用不可iterable进行迭代。我的检查是使用附加到TypeException的消息来确保这是原因,而不是不受支持的操作数 但作为异常的一部分的消息已被弃用。那么,我如何检查我的TypeException的原因呢 为了完整起见,我使用的代码与此非常相似:

我目前正在使用一个
try/except
块,在可能的情况下将某个特定变量视为可iterable,但在不可iterable时,用一种不同的、尽管正确的方式处理它

我的问题是,抛出TypeException的原因可能不是试图使用不可iterable进行迭代。我的检查是使用附加到TypeException的消息来确保这是原因,而不是不受支持的操作数

但作为异常的一部分的消息已被弃用。那么,我如何检查我的TypeException的原因呢

为了完整起见,我使用的代码与此非常相似:

            try:
               deref = [orig[x].value.flatten() for x in y]
            except TypeError as ex:
                if "object is not iterable" in ex.message:
                    x = y
                    deref = [orig[x].value.flatten()]
                else:
                    raise

将引发您感兴趣的异常的部分与引发无关异常的部分分开:

try:
    iterator = iter(y)
except TypeError:
    handle_that()
else:
    do_whatever_with([orig[x].value.flatten() for x in iterator])

如果适合您的用例,最好的方法是使用
collections.Iterable
。因为这是一项非常常见的任务,所以我倾向于将其包装在函数中:

from collections import Iterable

def iterify(obj):
    return obj if isinstance(obj, Iterable) else [obj]

deref = [orig[x].value.flatten() for x in iterify(y)]
但请注意:

检查
isinstance(obj,Iterable)
可检测已注册的类 作为Iterable或具有
\uuuu iter\uuuu()
方法,但它不检测 使用
\uuuu getitem\uuuu()方法进行迭代的类。唯一可靠的
确定对象是否可iter的方法是调用
iter(obj)


你能提供你正在使用的代码和期望的结果吗..为什么你需要捕捉它?你为什么不先检查一下它是否合适。。。像hasattr(y,'.'u iter'.@SamRedway:不是所有的iterables都有一个
\uu iter\uu
方法。@user2357112哈?真正地“我曾认为这是可数名词的定义?”桑雷德韦,见我回答中的引语<代码>\uu iter\uu
不是类可以迭代的唯一方式。