在编写程序时,可能会常常报出一些异样,很大一方面起因是本人的疏忽大意导致程序给出错误信息,另一方面是因为有些异样是程序运行时不可避免的,比方在爬虫时可能有几个网页的构造不统一,这时两种构造的网页用同一套代码就会出错,所以咱们就须要捕捉呈现的异样,以避免程序因为错误信息而终止运行。
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模块跟踪查看异样
除了曾经下载好的思维导图,也有一份在线版思维导图,我是用百度脑图绘制的,如果你感觉导图有哪局部不合理的话,能够依据本人的想法在网页端在线编辑。
获取形式:公众号【奶糖猫】后盾回复关键字「异样」。