人生苦短, 我选 Python
前文传送门
小白学 Python(1): 开篇 https://www.geekdigging.com/2019/10/12/2870915863/
小白学 Python(2): 基础数据类型 (上) https://www.geekdigging.com/2019/10/13/2870915864/
小白学 Python(3): 基础数据类型 (下) https://www.geekdigging.com/2019/10/15/25090937/
小白学 Python(4): 变量基础操作 https://www.geekdigging.com/2019/10/17/2392286754/
小白学 Python(5): 基础运算符 (上) https://www.geekdigging.com/2019/10/18/999362065/
小白学 Python(6): 基础运算符 (下) https://www.geekdigging.com/2019/10/20/2416267271/
小白学 Python(7): 基础流程控制 (上) https://www.geekdigging.com/2019/10/22/979409150/
小白学 Python(8): 基础流程控制 (下) https://www.geekdigging.com/2019/10/23/2184234984/
小白学 Python(9): 基础数据结构 (列表)(上) https://www.geekdigging.com/2019/10/23/3066758654/
小白学 Python(10): 基础数据结构 (列表)(下) https://www.geekdigging.com/2019/10/25/1277177083/
小白学 Python(11): 基础数据结构 (元组) https://www.geekdigging.com/2019/10/26/1783681326/
小白学 Python(12): 基础数据结构 (字典)(上) https://www.geekdigging.com/2019/10/27/1304658395/
小白学 Python(13): 基础数据结构 (字典)(下) https://www.geekdigging.com/2019/10/27/2327215405/
小白学 Python(14): 基础数据结构 (集合)(上) https://www.geekdigging.com/2019/10/29/2327215406/
小白学 Python(15): 基础数据结构 (集合)(下) https://www.geekdigging.com/2019/10/30/3105860436/
小白学 Python(16): 基础数据类型 (函数)(上) https://www.geekdigging.com/2019/10/31/3818474124/
小白学 Python(17): 基础数据类型 (函数)(下) https://www.geekdigging.com/2019/11/01/619492986/
小白学 Python(18): 基础文件操作 https://www.geekdigging.com/2019/11/01/3195979051/
前面我们已经写了这么多示例代码了, 对于报错信息各位同学可能都已经司空见惯了, 今天我们就来聊一下报错信息的处理.
首先, 程序在运行的过程中, 产生了异常, 这时, 我们可能会有两种想法, 第一种是针对这个异常做某些特殊的处理来进行程序的降级处理; 第二种是希望程序忽略这个异常继续执行下去, 这个异常可能并不干扰主逻辑的执行.
那这个时候我们怎么办呢?
有编程经验的同学马上就想到了, 那我们去 try 它啊, 在 Python 中, 我们同样可以去 try 它, 从字面意思上理解就已经非常清晰明确了, 以下的内容是要尝试执行的.
语法:
- try:
- ...(可能产生异常的代码)
- except:
- ...(产生异常后的处理代码)
但是, 还会有一种情况, 不管上面的代码有没有出错, 有一部分代码我们总希望它能执行, 这时, 我们可以添加另一个关键字 finally .
从字面意思可以就可以看出来, 这个是最后要执行的意思.
语法:
- try:
- ...(可能产生异常的代码)
- except:
- ...(产生异常后的处理代码)
- finally:
- ...(一定要执行的代码)
下面开始我们今天的代码演示.
我们先拟定一个场景, 我们定义一个除法函数, 如果除数不为 0 , 是可以正常返回值的, 如果除数为 0 , 那么整个程序肯定会直接异常报错.
- def division(x, y):
- try:
- return x / y
- except:
- print('程序报错啦!!!')
- return None
- print(division(15, 5))
输出结果如下:
3.0
这时程序是可以正常输出的, 这时我们修改一下调用的参数, 改为 division(15, 0) , 看下输出结果:
程序报错啦!!!
None
可以看到, 这里打印了我在程序中设置的 None , 并没有之前的红色的异常信息抛出. 这里的 except 会捕捉我们所有的异常信息, 但是, 异常信息也是有很多分类的, 比如我们之前遇到过的访问字典中不存在的 key 的异常 KeyError , 比如我们刚才捕捉到的 ZeroDivisionError 异常, 还有也是我们之前遇到过的数组下标越界的异常 IndexError .
比如这里的代码我可以捕捉更加详细的异常信息 ZeroDivisionError .
- def division1(x, y):
- try:
- return x / y
- except ZeroDivisionError:
- print('程序报错啦!!!')
- return None
- print(division1(15, 0))
输出结果如下:
程序报错啦!!!
None
那么, 看到这里, 你可能会有一个疑问, 我们为什么要对异常分类, 直接抓取所有异常不是更方便么?
当然, 对于逻辑比较简单的程序, 直接捕捉所有异常是更方便的, 但是在某些特定的业务场景下, 一段程序可能会抛出多种异常, 我们希望根据异常种类的不同, 定制不同的解决方案, 至少我们知道当前的程序是抛出了什么异常, 这时, 程序异常分类就显得尤为重要.
我们这里演示一下, 如果我们输出的值不是数字, 是字符串的话....
- def division2(x, y):
- try:
- return x / y
- except ZeroDivisionError:
- print('您输出的除数为 0 !!!')
- return None
- except TypeError:
- print('您输出的参数类型非法!!!')
- return None
- print(division2('python', 0))
输出结果如下:
您输出的参数类型非法!!!
None
对的, 你没有看错, 异常信息是能捕捉多个的, 是可以并排写的. 至于先抛出那个, 就要看那个异常先发生了.
因为示例代码的逻辑过于简单, 异常抛出顺序无法演示, 请各位同学见谅 (li zhi qi zhuang).
上面我们还提到了 finally , 我们接着来演示 finally 这个关键字的使用.
- def division3(x, y):
- try:
- return x / y
- except ZeroDivisionError:
- print('您输出的除数为 0 !!!')
- return None
- except TypeError:
- print('您输出的参数类型非法!!!')
- return None
- finally:
- print('你一定能看到我!!!')
- print(division3(15, 3))
- print(division3('python', 0))
可以看到, 这里我使用有异常和正常无任何问题的数据进行测试, 结果如下:
你一定能看到我!!!
5.0
您输出的参数类型非法!!!
你一定能看到我!!!
None
确实, finally 中的内容是能正常打印的, 这里多提一句, 这里经常的使用方式是来关闭一些 I/O 读写操作或者一些外部连接, 如数据库, 缓存服务等.
今天的内容就到这里, 各位同学请回去自行尝试.
示例代码
本系列的所有代码小编都会放在代码管理仓库 GitHub 和 Gitee 上, 方便大家取用.
示例代码 - GitHub
示例代码 - Gitee
来源: https://www.cnblogs.com/babycomeon/p/11839613.html