Python 未捕获TypeError异常
为什么这个Python 未捕获TypeError异常,python,python-2.x,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' obj
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__'
>>>
>>op=None
>>>尝试:
... val=op['one']
... 除KeyError外,TypeError:
... val=“一”
...
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
TypeError:“非类型”对象没有属性“\uuuu getitem\uuuu”
>>>
您必须将例外情况列表括在括号内:
except (KeyError, TypeError):
# ^ ^
val = "one"
Python2不允许在同一个
子句中指定多个异常,除非以这种方式指定子句。您可能希望,
创建一个异常元组(这将是有效的,因为),但实际情况并非如此
看看这个,我们有
其中逗号可与as
互换
换句话说,以下两个除外条款是等效的
except KeyError, e:
print "We got a key error!"
except KeyError as e:
print "We got a key error!"
这将捕获一个键错误
,并将其命名为e
。因此,在您的代码中,您捕获了一个KeyError
,并将其命名为TypeError
为了克服Python语法中的这种模糊性,并指定多个异常(Artyr和Downshift对此的解释值得称赞),必须使用括号强制将其解释为单个表达式(解释为异常的元组),而不是表达式逗号标识符
同样,上述两个表达式是等效的,并将捕获的异常分配给变量e
。值得注意的是,表单中有一个逗号,使语言语法不那么混乱
"except" [expression ["as" identifier]] ":"
@Krish这绝对是错误的解决方案,所以你能详细说明一下它没有帮助吗?>>op=None>>>试试看。。。val=op['one']。。。除了(KeyError,TypeError):。。。val=“一”。。。回溯(最近一次调用last):文件“”,第2行,在TypeError中:“NoneType”对象没有属性“\uuu getitem\uuuu'>>>
有趣的是,这个解决方案适合我。你保存了你的文件吗?没有,我正在控制台中尝试,就像我在上面粘贴的一样,mnie是Python 2.7.6当我保存并执行时,它按预期工作,谢谢。但我想知道为什么在控制台中尝试时它不起作用。>对于带有表达式的except子句,将对该表达式求值,如果结果对象与异常“兼容”,则该子句与异常匹配。如果对象是异常对象的类或基类,或者是包含与异常兼容的项的元组,则该对象与异常兼容。但是python2允许多个异常“一个except子句可以将多个异常命名为括号内的元组”except(RuntimeError、TypeError、NameError):
在语言规范中,逗号允许这样做。你可以在这里测试:@Artyer谢谢你的解释。“我有点失去理智了。”降档,谢谢!虽然,现在我看到了双倍,我又开始觉得有点不对劲了
except (KeyError, TypeError), e:
pass
except (KeyError, TypeError) as e:
pass
"except" [expression ["as" identifier]] ":"