未捕获TypeError异常

时间:2017-10-25 18:00:42

标签: python python-2.x

为什么TypeError没有被异常捕获?

>>> op=None
>>> try:
...     val = op['one']
... except KeyError, TypeError:
...     val = "one"
... 
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'
>>> 

2 个答案:

答案 0 :(得分:4)

您必须将例外列表括在parens / bracket中:

except (KeyError, TypeError):
    #  ^                   ^
    val = "one"

答案 1 :(得分:0)

Python 2不允许以这种方式在同一except子句中指定多个异常。您可能希望,创建一个异常元组(有效,如bernie demonstrates),但事实并非如此。

查看language spec,我们有

"except" [expression [("as" | ",") identifier]] ":"

逗号可与as互换。

换句话说,以下两个除了子句是等价的

except KeyError, e:
    print "We got a key error!"
except KeyError as e:
    print "We got a key error!"

这会抓取KeyError,并为其命名为e。因此,在您的代码中,您正在捕获KeyError并为其提供TypeError名称

为了克服Python语法中的这种模糊性,并指定多个例外(对Artyr和Downshift的解释),你必须使用括号来强制它被解释为单个表达式(是解释为异常元组),而不是AS 表达式COMMA标识符

except (KeyError, TypeError), e:
    pass
except (KeyError, TypeError) as e:
    pass

同样,上述两个表达式是等价的,并将捕获的异常分配给变量e。值得注意的是,带有逗号was removed in Python 3的表单使语言语法更加混乱!

"except" [expression ["as" identifier]] ":"