回溯 什么是Python回溯? Traceback( 三 )


AttributeError
当你试图访问一个对象上没有被定义的属性时,会引发AttributeError 。Python文档中定义了此异常何时被引发:
当属性引用或赋值失败时引发 。
下面是一个引发AttributeError的例子:

回溯 什么是Python回溯? Traceback

文章插图
 
AttributeError的错误消息行告诉你,在本例中,具体的对象类型,在本例中是int,没有访问的an_attribute属性 。在错误消息行中看到AttributeError可以帮助你快速确定你尝试访问的是哪个属性,以及要到哪里去修复它 。
大多数情况下,获得这个异常表明你正在处理的对象可能不是你期望的类型:
回溯 什么是Python回溯? Traceback

文章插图
 
在上面的例子中,你可能期望a_list是list类型的,它有一个名为.Append()的方法 。当你接收到AttributeError异常并看到它是在你尝试调用.append()时引发的,这说明你正在处理的对象类型可能不是你所期望的 。
通常,当你期望从一个函数或方法调用返回一个特定类型的对象时,会出现这种情况,你最终会得到一个类型为None的对象 。在本例中,错误消息行将写到,AttributeError: 'None类型'对象没有属性'append' 。
ImportError
【回溯 什么是Python回溯? Traceback】当一个import语句出错时,ImportError会被引发 。如果你试图导入的模块找不到,或者你试图从一个模块中导入模块中不存在的内容时,你将得到这个异常,或者它的子类ModuleNotFoundError 。Python文档定义了此异常何时被引发:
当import语句在尝试加载模块时遇到困难时引发 。当from…import中的“from list”中存在一个无法被找到的名称时也会引发 。
下面是一个ImportError 和ModuleNotFoundError被引发的例子 。
回溯 什么是Python回溯? Traceback

文章插图
 
在上面的例子中,你可以看到,当我们试图导入不存在的模块asdf时会导致ModuleNotFoundError 。当试图从一个存在的模块(这里是collections)中导入不存在的asdf时,就会导致ImportError 。回溯底部的错误消息行告诉你,在这两种情况下都不能导入asdf 。
IndexError
当你试图从一个序列(如列表或元组)中检索一个索引时,而该索引在这个序列中找不到时,就会引发一个IndexError 。Python文档定义了此异常何时会被引发:
当一个序列的下标超出范围时引发 。
下面是一个引发IndexError的例子:
回溯 什么是Python回溯? Traceback

文章插图
 
IndexError的错误消息行不会给你提供很好的信息 。你可以看到有一个超出范围的序列引用以及此序列的类型,在本例中是一个列表 。这些信息,加上其他回溯信息,通常足以帮助你快速确定如何修复此问题 。
KeyError
与IndexError类似,当你试图访问映射(通常是dict)中没有的键时,会引发KeyError 。你可以把它看作是IndexError,只不过是针对字典的 。Python文档定义了此异常何时被引发:
当在现有键集合中找不到一个映射(字典)键时引发 。
下面是一个KeyError被引发的例子:
回溯 什么是Python回溯? Traceback

文章插图
 
KeyError的错误消息行会给出找不到的键 。这并没有太多的内容,但是,结合回溯的其他内容,但对于修复这个问题来说通常是足够了 。
要深入了解KeyError,请查看《Python KeyError异常以及如何处理它们》 。
NameError
当你引用了一个代码中未定义的变量、模块、类、函数或其他名称时,将引发一个NameError 。Python文档定义了此异常何时被引发:
当本地或全局名称未被找到时引发 。
在下面的代码中,greet()接受一个参数person 。但在函数本身中,该参数被错误拼写为persn:
回溯 什么是Python回溯? Traceback

文章插图
 
NameError 回溯的错误消息行给出了缺失的名称 。在上面的例子中,它是一个传入函数的拼写错误的变量或参数 。
如果它是你拼写错误的参数,那么NameError也会被引发:
回溯 什么是Python回溯? Traceback

文章插图
 
在这里,你似乎没有做错什么 。在回溯中被执行和引用的最后一行看起来不错 。如果你发现自己处于这种情况,那么你要做的事情就是查看代码,确定person变量在哪里被使用和定义 。在这里,你可以很快看到参数名称拼错了 。


推荐阅读