社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

干货!一张图整理了 Python 所有内置异常

python • 4 年前 • 430 次点击  

            ↑ "奶糖猫"一个值得星标的公众号

                         


         本文约1500字,阅读大概需要6分钟

在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一套代码就会出错,所以我们就需要捕获出现的异常,以防止程序因为错误信息而终止运行。

Python有很多的内置异常,也就是说Python开发者提前考虑到了用户编程过程中可能会出现这类错误,所以制造了这些内置异常可以快速准确向用户反馈出错信息帮助找出代码中的bug。

Python官方文档中也给出了所有内置异常及触发条件,为了更好的阅读体验,我把所有异常及触发条件整理成了一张思维导图:

文末附有高清版本的获取方式,伙伴们可以直接划至文末取图,下面针对几个常见的异常单独介绍一下,通过举例深入了解在什么条件下会触发哪一种异常。

1、SyntaxError

SyntaxError主要是Python语法发生了错误,比如少个冒号、多个引号之类的,编程时稍微疏忽大意一下就会出错,应该是最常见的一种异常错误了。

In [1]: While True print('1')
  File "", 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)
-9-5ae0619f8fe1> in 
----> 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)
-17-94e0dfab3ff6> in 
----> 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)
-19-c2e43847635f> in 
----> 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)
-23-9a1887cf29d7> in 
----> 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)
-26-516844ad2563> in 
----> 1 dict_.index('1')

AttributeError: 'dict' object has no attribute 'index'

7、NameError

NameError是指变量名称发生错误,比如用户试图调用一个还未被赋值或初始化的变量时会被触发。

In [27]: print(list_)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
-27-87ebf02ffcab> in 
----> 1 print(list_)

NameError: name 'list_' is not defined

8、FileNotFoundError

FileNotFoundError为打开文件错误,当用户试图以读取方式打开一个不存在的文件时引发。

In [29]: fb = open('./list','r')
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
-29-1b65fe5400ea> in 
----> 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)
-35-5a5a8526e73b> in 
----> 1 next(list2)

10、AssertionError

AssertionError为断言错误,当用户利用断言语句检测异常时,如果断言语句检测的表达式为假,则会引发这种异常。

In [45]: list3 = [1,2]

In [46]: assert len(list3)>2
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
-46-ffd051e2ba94> in 
----> 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模块跟踪查看异常

除了已经下载好的思维导图,也有一份在线版思维导图,我是用百度脑图绘制的,如果你觉得导图有哪部分不合理的话,可以根据自己的想法在网页端在线编辑,左下角阅读原文是参考的官方文档链接。

获取方式:公众号后台回复关键字「异常

End

奶糖猫   

优秀的人都在看   


在看点一下
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/72131
 
430 次点击