为什么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__'
>>>
答案 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]] ":"