在写程序的时候,可能会经常报一些异常。一方面是因为你自己的疏忽导致程序给出了错误信息。另一方面,一些异常是程序运行时不可避免的。比如在爬取的时候,可能会出现几个结构不一致的网页。这时候,同一套代码就会导致两种结构的网页出错。因此,我们需要捕获发生的异常,以防止程序出现错误信息。并终止操作。Python有很多内置的异常,这意味着Python的开发者已经提前考虑到用户编程过程中可能会出现此类错误,所以这些内置的异常可以快速准确的向用户反馈错误信息,帮助查找代码中的bug.Python官方文档中也给出了所有内置的异常和触发条件。为了更好的阅读体验,我把所有的异常和触发条件整理成了一张思维导图:下面分别介绍几种常见的异常,通过举例来深入了解在什么条件下会触发什么样的异常。1.SyntaxErrorSyntaxError主要是Python语法错误,比如少了冒号,多引号等,编程时稍有不慎就会出错。应该是最常见的异常错误了。在[1]:WhileTrueprint('1')File"",line1WhileTrueprint('1')^SyntaxError:invalidsyntax2.TypeErrorTypeError是类型错误,意思是对不合适类型的对象应用了Raised操作或函数,比如整数和字符的加减,两个列表之间的减法等等。In[8]:a=[1,2];b=[2,3]In[9]:a-b-----------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)in---->1a-bTypeError:unsupportedoperandtype(s)for-:'list'和'list'3。IndexErrorIndexError指的是索引中的错误,比如最常见的超出序列边界的下标索引,比如当一个序列m只有三个元素时,却试图访问m[4]。In[16]:m=[1,2,3]In[17]:m[4]--------------------------------------------------------------------------IndexErrorTraceback(mostrecentcalllast)in---->1m[4]IndexError:listindexoutofrange4。KeyErrorKeyError是关键字错误,这个异常主要发生在字典中,比如当用户试图访问字典中某个键不存在时引发。In[18]:dict_={'1':'yi','2':'er'}In[19]:dict_['3']------------------------------------------------------------------------KeyErrorTraceback(mostrecentcalllast)in---->1dict_['3']KeyError:'3'5。ValueErrorValueError是一个值错误,当用户传入调用者不期望的值时引发,即使该值的类型正确,例如试图获取列表中不存在的值的索引。In[22]:n=[1,2,3]In[23]:n.index(4)----------------------------------------------------------------------ValueErrorTraceback(mostrecentcallast)in---->1n.index(4)ValueError:4isnotinlist6。AttributeErrorAttributeError是一个属性错误,当用户试图访问对象中不存在的属性时引发,例如列表有索引方法,但字典没有,因此在字典对象上调用此方法将导致这个异常。In[25]:dict_={'1':'yi','2':'er'}In[26]:dict_.index('1')--------------------------------------------------------------------AttributeErrorTraceback(mostrecentcalllast)in---->1dict_.index('1')AttributeError:'dict'objecthasnoattribute'指数'7。NameErrorNameError指的是变量名错误,比如当用户试图调用一个还没有被赋值或者初始化的变量时,就会被触发。In[27]:print(list_)--------------------------------------------------------------------------NameErrorTraceback(mostrecentcalllast)in--->1print(list_)NameError:name'list_'isnotdefined8。FileNotFoundErrorFileNotFoundError是打开文件错误,当用户试图以读取模式打开一个不存在的文件时触发。In[29]:fb=open('./list','r')----------------------------------------------------------------------FileNotFoundErrorTraceback(mostrecentcallast)in---->1fb=open('./list','r')FileNotFoundError:[Errno2]Nosuchfileordirectory:'./list'9.StopIterationStopIteration是一个迭代器错误,当访问到迭代器的最后一个值并继续访问时,会抛出这个异常来提醒用户迭代器中没有更多的值可以访问了。In[30]:list1=[1,2]In[31]:list2=iter(list1)In[33]:next(list2)Out[33]:1In[34]:next(list2)Out[34]:2In[35]:next(list2)--------------------------------------------------------------------------StopIterationTraceback(mostrecentcalllast)在---->1next(list2)10.AssertionErrorAssertionError是断言错误。当用户使用断言语句检测异常时,如果断言语句检测到的表达式为假,则触发该异常。In[45]:list3=[1,2]In[46]:assertlen(list3)>2--------------------------------------------------------------------------AssertionErrorTraceback(mostrecentcalllast)in---->1assertlen(list3)>2AssertionError:以上异常应该是正常编程中遇到频率比较高的部分,完整度取决于上面思维导图还是参考官方文档,当然另外,Python也支持用户根据自己的需要自定义异常,这里就不过多赘述了。对于异常处理,Python也有比较强大的功能,比如捕获异常,主动抛出异常等,主要有以下几种方式:try...except结构语句捕获try...except...finally结构语句捕获try...except...else结构语句捕获raise关键字主动抛出异常try...raise...except触发异常assert断言语句traceback模块trace查看异常