这是本文的标题
前言
今天说说Python的异常处理。和其他语言一样,异常处理是Python中一种很常见并且很重要的机制与代码规范。
在实际工作当中见到过很多次这样的情况,因为工程师提交了代码,不过代码某处忘记了异常处理,碰巧这种异常发生的频率不低,所以在代码push到线上后没多久,就会收到紧急通知,服务器崩溃了。
如果事情严重,对用户的影响也很大,那这位工程师还得去专门的会议上做自我检讨,可以说是很惨了。这个事件层出不穷,也告诉我们正确理解和处理程序中的异常尤为关键。因为包含大量的代码块,(文末有福利)
错误与异常
通常来说,程序中的错误至少包括两种,一种是语法错误,另一种则是异常。 所谓语法错误就是你写的代码不符合编程规范,无法被识别与执行,
比如下面这个例子:
If语句漏掉了冒号,不符合Python的语法规范,所以程序就会报错,Invalid syntax。
而异常则是指程序的语法正确,也可以被执行,但在执行过程中遇到错误,抛出了异常,
Python中还有很多其他异常类型,比如key error是指字典中的件找不到,File not found error是指发送了读取文件的请求,但相应的文件不存在等等。在此也不一一的去赘述,可以自行参考相应的文档。
如何处理异常
如果执行到程序中某处抛出了异常,程序就会被终止并退出。这也就是我们所说的异常处理,通常使用TRY和except来解决,比如下面的例子:
这里默认用户输入以逗号相隔的两个整形数字,将其提取后做后续的操作。如果我们输入A、B,程序便会抛出异常invalid literal for int with base10:‘a’,然后跳出TRY这个block。
由于程序抛出的异常类型是value error和except block所catch的异常类型相匹配,所以except block便会被执行,最终输出value error:invalid literal for int()with base 10:‘a’,并打印出continue。
我们知道except block只接受与它相匹配的异常类型并执行,如果程序抛出的异常并不匹配,那么程序照样会终止并退出。
所以还是刚刚这个例子,如果我们只输入1,程序抛出的异常,就是index error:list index out of range ,与value error不匹配,那么except block就不会被执行,程序便会终止并退出。
不过很显然,这样强调一种类型的写法有很大的局限性。那么该怎么解决这个问题呢?
其中一种解决方案是在except block中加入多种异常的类型,比如下面这样的写法:
或者第二种写法:
这样每次程序执行时,Except block中只要有一个exception类型与实际匹配即可。
很多时候,我们很难保证程序覆盖所有的异常类型,所以更通常的做法是是在最后一个except block声明及处理的异常类型是exception. exception是其他所有非系统异常的基类,能够与任意非系统异常相匹配。那么代码就可以写成这样:
或者你也可以在except后面省略异常类型,这表示与任意异常相匹配。
当程序中存在多个except block时,最多只有一个except block会被执行。如果多个except生灵的异常类型都与实际相匹配,那么只有最前面的except block会被执行,其他则被忽略。
异常处理中还有一个很常见的用法是,Finally经常和try 、except放在一起来用。 无论发生什么情况,Finally block中的语句都会被执行,哪怕前面的TRY和except block中使用了return语句。
一个常见的应用场景便是文件的读取:
这段代码中,Try block尝试读取file.txt这个文件,并对其中的数据进行一系列的处理。到最后,无论是读取成功还是读取失败,程序都会执行finally中的语句,关闭这个文件流,确保文件的完整性。因此,在finally中,我们通常会放一些无论如何都要执行的语句。
对于文件的读取,我们也常常是用with open,With open会在最后自动关闭文件,让语句更加简洁。
用户自定义异常
自己可以创建异常类型吗?Python也是允许我们可以这么做的。在实际工作当中,如果内置的异常类型无法满足我们的需求,或者为了让异常更加详细可读,想增加一些异常类型的其他功能,我们可以自定义所需异常类型。不过大多数情况下,Python内置的异常类型就足够好了。
异常的使用场景与注意点。
通常来说,在程序中,如果我们不确定某段代码能否成功执行,往往这个地方就需要使用异常处理。比如:
在大型社交网站的后台需要针对用户发送的请求返回相应记录。用户记录往往储存在key value结构的数据库中,每次有请求过来后,我们拿到用户的ID,并用ID查询数据库中此人的记录,就能返回相应的结果。
而数据库返回的原始数据往往是Json string的形式,这就需要我们首先对Jason string进行解码。我们可能会很容易想到下面的方法:
在json.loads()函数中输入的字符串如果不符合其规范,那么便无法解码,就会抛出异常,因此加上异常处理十分必要。
但是我们不能走向另一个极端,滥用异常处理。
比如,当你想要查找字典中某个键对应的值时,绝不能写成下面这种形式:
显然,这样的代码并没有bug,但是让人看了摸不着头脑也显得很冗余。如果你的代码中充斥着这种写法,无疑对阅读、写作来说都是障碍。因此,对于follow control,也就是流程控制的代码逻辑,我们一般不用异常处理
总结
关于Python的异常处理及其使用场景,我们需要重点掌握下面几点
1、异常,通常是指程序运行的过程中遇到了错误,终止并退出。我们通常使用try except语句去处理异常,这样程序就不会被终止,仍能继续执行。
2、处理异常时,如果有必须执行的语句,比如文件打开后必须关闭等等,则可以放在finally block中。
3、异常处理通常用在你不确定某段代码能否成功执行,也无法轻易判断的情况下,比如数据库的连接读取等等。正常的follow control逻辑不要使用异常处理,直接使用条件语句解决就可以了。
小伙伴们如果你也喜欢python,不妨和我一起来学学
零基础Python学习指南
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python必备开发工具👈
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉100道Python练习题👈
检查学习结果。
👉面试刷题👈
👉资料领取👈
这份完整版的Python全套学习资料已为大家备好,朋友们如果需要可以微信扫描下方二维码添加“住隔壁的王叔”,输入"领取资料" 可免费领取全套资料【有什么需要协作的还可以随时联系我】朋友圈也会不定时的更新最前言python知识。