在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如:在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一套代码就会出错
所以,我们就需要捕获出现的异常,以防止程序因为错误信息而终止运行
Python 有很多的内置异常,也就是说 Python 开发者提前考虑到了用户编程过程中可能会出现这类错误,所以制造了这些内置异常可以快速准确向用户反馈出错信息帮助找出代码中的 Bug
Python 官方文档中也给出了所有内置异常及触发条件,为了更好的阅读体验,我把所有异常及触发条件整理成了一张思维导图:
文末附有高清版本的获取方式
伙伴们可以直接划至文末取图,下面针对几个常见的异常单独介绍一下,通过举例深入了解在什么条件下会触发哪一种异常。
1、SyntaxError
SyntaxError 主要是 Python 语法发生了错误,比如少个冒号、多个引号之类的,编程时稍微疏忽大意一下就会出错,应该是最常见的一种异常错误了
In [1]: While True print(‘1’)
File “<ipython-input-1-8ebf67bb4c2b>”, line 1
While True print(‘1’)
^
SyntaxError: invalid syntax
2、TypeError
TypeError 是类型错误,也就是说将某个操作或功能应用于不合适类型的对象时引发,比如整型与字符型进行加减法、在两个列表之间进行相减操作等等
In [8]: a = [1,2];b = [2,3]
In [9]: a-b
—————————————————————————
TypeError Traceback (most recent call last)
<ipython-input-9-5ae0619f8fe1> in <module>
—-> 1 a-b
TypeError: unsupported operand type(s) for -: ‘list’ and ‘list’
3、IndexError
IndexError 是指索引出现了错误,比如最常见下标索引超出了序列边界,比如当某个序列 m 只有三个元素,却试图访问 m[4]
In [16]: m = [1,2,3]
In [17]: m[4]
—————————————————————————
IndexError Traceback (most recent call last)
<ipython-input-17-94e0dfab3ff6> in <module>
—-> 1 m[4]
IndexError: list index out of range
4、KeyError
KeyError 是关键字错误,这个异常主要发生在字典中,比如当用户试图访问一个字典中不存在的键时会被引发
In [18]: dict_ = {‘1’:‘yi’,‘2’:‘er’}
In [19]: dict_[‘3’]
—————————————————————————
KeyError Traceback (most recent call last)
<ipython-input-19-c2e43847635f> in <module>
—-> 1 dict_[‘3’]
KeyError: ‘3’
5、ValueError
ValueError 为值错误,当用户传入一个调用者不期望的值时会引发,即使这个值的类型是正确的,比如想获取一个列表中某个不存在值的索引
In [22]: n = [1,2,3]
In [23]: n.index(4)
—————————————————————————
ValueError Traceback (most recent call last)
<ipython-input-23-9a1887cf29d7> in <module>
—-> 1 n.index(4)
ValueError: 4 is not in list
6、AttributeError
AttributeError 是属性错误,当用户试图访问一个对象不存在的属性时会引发,比如列表有 index 方法,而字典却没有,所以对一个字典对象调用该方法就会引发该异常
In [25]: dict_ = {‘1’:‘yi’,‘2’:‘er’}
In [26]: dict_.index(‘1’)
—————————————————————————
AttributeError Traceback (most recent call last)
<ipython-input-26-516844ad2563> in <module>
—-> 1 dict_.index(‘1’)
AttributeError: ‘dict’ object has no attribute ‘index’
7、NameError
NameError 是指变量名称发生错误,比如用户试图调用一个还未被赋值或初始化的变量时会被触发
In [27]: print(list_)
—————————————————————————
NameError Traceback (most recent call last)
<ipython-input-27-87ebf02ffcab> in <module>
—-> 1 print(list_)
NameError: name ‘list_’ is not defined
8、FileNotFoundError
FileNotFoundError 为打开文件错误,当用户试图以读取方式打开一个不存在的文件时引发
In [29]: fb = open(‘./list’,‘r’)
—————————————————————————
FileNotFoundError Traceback (most recent call last)
<ipython-input-29-1b65fe5400ea> in <module>
—-> 1 fb = open(‘./list’,‘r’)
FileNotFoundError: [Errno 2] No such file or directory: ‘./list’
9、StopIteration
StopIteration 为迭代器错误,当访问至迭代器最后一个值时仍然继续访问,就会引发这种异常,提醒用户迭代器中已经没有值可供访问了
In [30]: list1 = [1,2]
In [31]: list2 = iter(list1)
In [33]: next(list2)
Out[33]: 1
In [34]: next(list2)
Out[34]: 2
In [35]: next(list2)
—————————————————————————
StopIteration Traceback (most recent call last)
<ipython-input-35-5a5a8526e73b> in <module>
—-> 1 next(list2)
10、AssertionError
AssertionError 为断言错误,当用户利用断言语句检测异常时,如果断言语句检测的表达式为假,则会引发这种异常
In [45]: list3 = [1,2]
In [46]: assert len(list3)>2
—————————————————————————
AssertionError Traceback (most recent call last)
<ipython-input-46-ffd051e2ba94> in <module>
—-> 1 assert len(list3)>2
AssertionError:
上面这些异常应该是平时编程中遇见频率比较高的一部分,完整的还是要看上文的思维导图或者查阅官方文档,当然除此之外,Python 也支持用户根据自己的需求自定义异常,这里就不再过多概述了。
对于异常的处理 Python 也有着比较强大的功能,比如可以捕获异常,主动抛出异常等等,主要有下面几种方式:
-
1.try … except 结构语句捕获 -
2.try … except … finally 结构语句捕获 -
3.try … except … else 结构语句捕获 -
4.raise关键字主动抛出异常 -
5.try … raise … except 触发异常 -
6.assert断言语句 -
7.traceback模块跟踪查看异常
除了已经下载好的思维导图,也有一份在线版思维导图,我是用百度脑图绘制的
如果你觉得导图有哪部分不合理的话,可以根据自己的想法在网页端在线编辑,左下角阅读原文是参考的官方文档链接
本文转自AirPython.
我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典