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

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

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

获取方式:公众号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模块跟踪查看异常

史上最全Python资料汇总(长期更新)。隔壁小孩都馋哭了 --- 点击领取

太干了!一张图整理了 Python 所有内置异常的更多相关文章

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

    在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...

  2. str.方法的整理(字符串类型内置方法的具体使用)

    <1>str.strip().str.lstrip()和str.rstrip() 1' str.strip()(主要方法) 方法:str.strip(self,chars) 作用:移除字符 ...

  3. python常用内置函数整理

    1.最常见的内置函数是print print("Hello World!") 2.数学运算 abs(-5) # 取绝对值,也就是5 round(2.6) # 四舍五入取整,也就是3 ...

  4. Python常用内置函数整理(lambda,reduce,zip,filter,map)

    匿名函数lambda lambda argument1,argument2,...argumentN :expression using arguments 1.lambda是一个表达式,而不是一个语 ...

  5. 【装逼利器效率软件】一张图问你想不想用Launchy

    简述:Launchy博客园很多文章,长篇大论文字太多. 一张图问你想不想用? 长话多说: 一.设置Launchy扫描目录,安装后会默认,个人推荐自定义目录比较好 二.自行建立快捷方式别名文件夹,存放各 ...

  6. 2.5w字 + 36 张图爆肝操作系统面试题,太牛逼了!

    欢迎各位大佬访问我的 github ,跪求 star bestJavaer 大家好,我是 cxuan,我之前汇总了一下关于操作系统的面试题,最近又重新翻阅了一下发现不是很全,现在也到了面试季了,所以我 ...

  7. 程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?| 每一张图都力求精美

    悟空 种树比较好的时间是十年前,其次是现在. 自主开发了Java学习平台.PMP刷题小程序.目前主修Java.多线程.SpringBoot.SpringCloud.k8s. 本公众号不限于分享技术,也 ...

  8. 从一张图开始,谈一谈.NET Core和前后端技术的演进之路

    从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...

  9. 一张图看懂Rxjava的原理

    前言 Rxjava是NetFlix出品的Java框架, 官方描述为 a library for composing asynchronous and event-based programs usin ...

随机推荐

  1. webpack学习遇到大坑(纯属自己记录)

    分清webpack1与webpack2区别 1.webpack2的loader不能使用简写了,否则会报如下的错 正确如下: 2.node-sass安装失败,无法下载:Cannot download h ...

  2. F2. Same Sum Blocks (Hard) 解析(思維、前綴和、貪心)

    Codeforce 1141 F2. Same Sum Blocks (Hard) 解析(思維.前綴和.貪心) 今天我們來看看CF1141F2(Hard) 題目連結 題目 給你一個數列\(a\),要你 ...

  3. 在IIS中部署前后端应用,多么痛的领悟!

    目前手上的Web项目是前后端分离的,所以有时也会倒腾Vue框架. 前后端应用最终以容器形态.在k8s中部署, 为此我搭建了基于Gitlab flow的Devops流程. 在Devops实践中,容器部署 ...

  4. Ordering Cows

    题意描述 好像找不到链接(找到了请联系作者谢谢),所以题目描述会十分详细: Problem 1: Ordering Cows [Bruce Merry, South African Computer ...

  5. 【QT】跨线程的信号槽(connect函数)

    线程的信号槽机制需要开启线程的事件循环机制,即调用QThread::exec()函数开启线程的事件循环. Qt信号-槽连接函数原型如下: bool QObject::connect ( const Q ...

  6. 自定义MFC对话窗口的类名

    默认情况下,MFC对话框的窗口类名为"#32770",如果想自定义窗口类名呢,需要两步: 1.修改rc文件 这一步需要直接编辑rc文件,使用任意记事本工具即可,找到窗口的相关定义, ...

  7. ixgbe 驱动 为xxx驱动做准备1

    网卡都是pci设备,因此这里每个网卡驱动其实就是一个pci驱动.并且intel这里是把好几个万兆网卡(82599/82598/x540)的驱动做在一起的.V4L2 一样几个类型摄像头合并在一起 先说一 ...

  8. linux解释器、内建和外建命令

    查看系统是哪种命令解释器: [root@localhost ~]# echo $SHELL /bin/bash 内建命令:是shell程序的一部分,包含的是一些比较简单的linux系统命令,这些命令由 ...

  9. Ceph OSD从filestore 转换到 bluestore的方法

    前言 前段时间看到豪迈的公众号上提到了这个离线转换工具,最近看到群里有人问,找了下没什么相关文档,就自己写了一个,供参考 实践步骤 获取代码并安装 git clone https://github.c ...

  10. git-新建git用户流程-1

    1.输入:https://git-scm.com/ 2.点击try git 4.注册git填写用户名和密码,邮箱,验证邮箱 5.选择免费的版本 6.创建仓库名称 创建成功见截图