3

这两种错误有什么区别?什么时候使用它们中的每一个?

4

3 回答 3

7

属性是函数或类或模块的属性,如果找不到属性,则会引发attribute error.

NameError与变量有关。

>>> x=2
>>> y=3
>>> z    #z is not defined so NameError

Traceback (most recent call last):
  File "<pyshell#136>", line 1, in <module>
    z
NameError: name 'z' is not defined

>>> def f():pass

>>> f.x=2 #define an attribue of f
>>> f.x
2
>>> f.y   #f has no attribute named y

Traceback (most recent call last):
  File "<pyshell#141>", line 1, in <module>
    f.y
AttributeError: 'function' object has no attribute 'y'

>>> import math   #a module  

>>> math.sin(90) #sin() is an attribute of math
0.8939966636005579

>>> math.cosx(90)  #but cosx() is not an attribute of math

Traceback (most recent call last):
  File "<pyshell#145>", line 1, in <module>
    math.cosx(90)
AttributeError: 'module' object has no attribute 'cosx'
于 2012-08-12T11:12:52.920 回答
2

文档中,我认为文本很容易解释。

NameError 在找不到本地或全局名称时引发。这仅适用于非限定名称。关联的值是一条错误消息,其中包含无法找到的名称。

AttributeError 当属性引用(请参阅属性引用)或分配失败时引发。(当对象根本不支持属性引用或属性分配时,会引发 TypeError。)

在上面的示例中,当您尝试访问非限定名称(本地或全局)时,对zraises的引用NameError

在你的最后一个例子math.cosx中是一个点访问(属性引用),在这种情况下是数学模块的一个属性,因此AttributeError被提出。

于 2012-08-12T11:12:04.697 回答
0

如果您尝试访问之前未定义或分配的变量,Python 会提出一个名称。当您尝试访问之前未分配或定义的实例的实例变量时,会引发 AttributeError。

http://docs.python.org/library/exceptions.html

于 2012-08-12T11:11:43.017 回答