洗礼灵魂,修炼python(28)--异常处理(2)—>运用异常
你可能会想,卧槽这标题取的,前面不是说异常就是报错吗?异常还能运用?
是的,异常确实可以运用,可以刻意制造异常,在出现异常时捕获异常并对异常处理,所以进入本篇博文的话题—异常处理
异常处理:
异常处理分两个,捕获异常和抛出异常
一、捕获异常
1.为什么要捕获异常?
这个问题应该都会想到的,出错就出错,改就是啊,不急,先看一个例子:
我个人理解:在实际的开发中,异常是很常见的,程序员需要事先考虑所有的可能性,不然的话,你把你的程序给用户用,出现像上面这个情况,这样影响很大,在客户的角度,他们不管是什么,也不会在意这报错的是什么,他们希望的就是代码运行,永远不会出错,该怎么样就怎样的,如果出错,他们就会觉得不行,体验差,然后跟你抱怨怎么样怎么样,在他们心里也会觉得你并不是一个好的程序员。所以,异常,我们是在开发时就要考虑所有的可能性的,并且对每个可能性做出针对性的处理,让客户看不到这段红色的报错,并且用一个简单的或者通俗易懂的提示告诉客户哪里有问题。所以需要捕获异常
2.怎么捕获:
使用try-except[-finally]语句捕获异常
格式:
try: 检测范围(代码块) except Exception[as reason] #使用Exception表示接受所有的异常,因为前面说了Exception是所有异常的基类 出现异常(Exception)后的处理代码 finally: 无论如何都会被执行的代码
例:
注意:
1):这里的except语句就是用来捕获异常类的,当你知道程序会报什么类型的错,就在后面写上什么异常类,这就是捕获
2):finally语句并不是必须出现,可以省略,finally语句的作用是无论如何都要运行,不管捕获到异常与否(下面会详解)
3):try语句其实也是判断语句中的一种,和if语句很相似,只是相对if比较特殊
3.else语句
说到这里,我想你应该发现了,try语句是捕获异常的,那如果程序没有出错呢?如果程序没错,那必须得输出结果对吧?前面又说到其实try语句就是判断语句中的一种,那么if都可以有else,try可不可有呢?当然可以,else语句就是当程序没错时作输出用的(是不是和if判断语句里的用法不太一样?下面会详解)。例:
不过要注意的是,else语句必须写在finally语句前面,不然啊报错:
4.打印异常
前面的代码中,可以看出程序捕获到异常后,会反馈给用户一个提示。但是又出现一个很常见的问题,在开发中,虽然我们尽可能的把我们想到的所有可能性做出了相应的解决方案,但是总有百密一疏的时候对吧?那么我们的程序在出现BUG的时候,由于我们把异常规避了,给用户一个提示完事,那万一就是这里出现错误,我们需要根据异常来修复程序,但是异常被规避了看不到啊,怎么办呢?
这里就又有一个新的写法:as语句(在前面导入模块时用过的)
看到没,我把这个异常类用as语句定义到一个变量里,然后打印这个变量,这样,上面那句话是提示给用户的,下面那句话就给我们程序员看的。这样是不是就给我们带来方便了?
二、抛出异常
1.什么是抛出异常:
为了开发需要,刻意的让程序报错
2.怎么抛出:
使用raise语句
格式:
raise 异常类
例:
raise语句就可以刻意的制造异常
三、从实际案列中剖析问题
例:打开文档并打印文档内容
在前面【文件操作】那一章应该都知道文件操作,如果不再需要文件,最后要把文件关闭的对吧?那么在程序某个过程报错时,程序就会跳出并结束,下面的代码就不再进行,所以根本到不了关闭语句那里,但是此时文件还是开启状态的,所以文件就一直是挂起状态,这样对开发的影响是很大的。而这里有了finally语句就可以无论如何都运行,所以无论如何都会在最后执行关闭语句把文件关闭了,这里就可以看出finally语句的功效了
前面文件操作时,应该介绍过with语句了,这里既然都说到文件操作,就再提一下。
with语句的功能就是在打开对象时,如果在一定时间内不再对对象有操作,那么with语句将会自动的把对象关闭,这也是python的回收机制的功劳
注意:
1.当有使用with语句,就可以不使用finally语句来关闭文件
2.python2和python3里异常类有点不同:
1):python2:
2):python3:
python2和python3还有哪些不同不一一解析,自己去体验吧,如果后面有时间,我专门开一篇博文介绍python2和python3的差别
四、else语句在if语句,while和for循环语句和在try语句里的区别
- 在if循环里:else表示否则则运行
- 在while和for循环里:else表示干完了能怎样,或者表示干不完就别想怎样。但当有break跳出循环,则不运行else
- 在try语句里:else表示如果没有异常,那就运行,有问题就不会运行
好的,异常处理这一块讲解完毕