我们的计算机程序在运行时,有时也会由于各种不可控的原因出现错误。例如:找不到需要的文件、网络错误、用户输入不对等等。这时,计算机程序就会出现无法继续运行的情况,甚至会直接退出。比如:我们常见的手机APP闪退,网站出现500错误,或者Windows里的如下错误:
相信大家遇到这样的情况,都很恼火吧?对于用Python编写的程序。当 Python 检测到一个错误时,解释器无法继续执行,反而出现了一些错误的提示,这就是所谓的"Python异常"。因此,为了让我们的程序可以稳定地长久运行,你需要知道如何正确处理异常。
目录
你们的三连(点赞,收藏,评论)是我持续输出的动力,感谢。
在兴趣中学习,效益超乎想象,有趣的源码与学习经验,工具安装包,欢迎加我的微信:bobin1124,一起交流学习与分享。
一、Python异常简介
1.Python程序中的异常
前面说了那么多,那Python异常到底是怎样的呢?别急,我们先来看看Python程序中的异常是怎么呈现的。
如上图所示,当我们想要运行python程序文件 test.py 时,在终端键入python test.py
并按下回车之后,屏幕上在“-----test--1---
”之后 ,会出现的一串信息:
Traceback (most recent call last):
File "C:/workspace/boxuegu/exception/test.py", line 2, in <module>
open('123.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'
这个就是Python异常信息。图片中这段异常,意思是说:文件test.py在第二行出现了错误,这是一个编号为2的“输入输出型
”的错误,名叫“123.txt
”的文件不存在。
为什么会出现这样的异常呢?我们来看一下这叫做test.py的python程序文件的源代码长啥样:
print('-----test--1---')
open('123.txt','r')
print('-----test--2---')
对应着运行结果,我们看到,原本程序在open()打开文件操作之后,还要打印”-----test--2---
“,但结果却没有执行打印”-----test--2---
“这个动作。
这是因为,我们在使用open()函数尝试打开一个不存在的文件“123.txt
”,当找不到“123.txt
” 文件时,程序就会抛出给我们一个FileNotFoundError
类型的错误,No such file or directory:123.txt”(没有 123.txt 这样的文件或目录)。
当 Python 检测到一个错误,并且无法处理时,就会出现一些错误的提示,这就是所谓的"异常"。如果一直没有对异常进行处理,那么程序就会强制退出执行。
2.常见的异常及继承结构
在 Python 中,异常会通过一个对象(object)来表示,对象中存储着关于异常的信息。我们在编程时,经常遇见的一些异常有:
除上述常见异常,在Python 3中,还内置了其他种类的异常,在这里我们列举部分例子
完整的Python 3内置异常,你可以在Python官网查询到:https://docs.python.org/3/tutorial/errors.html
在Python中,所有的异常和错误,都继承自 BaseException 这个基类。但在实际开发中,我们还会更多地与Exception这个父类打交道。Exception 继承自BaseException,实现了我们处理异常中需要的常见方法。Python内置的异常,也大多继承自Exception,并以自身的异常描述,作为名字,命名规则往往为AbcException或XyzError这样。
二 、异常的处理
1.捕获异常
首先,作为计算机,它需要我们告知它,哪里可能会有异常,以及会有什么样的异常,即异常的捕获。
在 Python 中,与其它语言类似,我们会使用 try…except…捕获异常 。
先看如下代码示例:
try:
print('-----test--1---')
open('123.txt','r')
print('-----test--2---')
except IOError:
pass
能看的出,第二段“-----test--2---
”同样没有打印出来,程序却正常退出了。这是因为,这里我们用 try 和 except 捕获到了 IOError 异常,并添加了处理的方法。因此,print(’-----test–2—’)语句并没有被执行。
我们通过try 关键字,包含逻辑代码,表示在这里可能会出现异常,需要处理。程序执行到某条语句时如果发生了异常,则不会继续执行,而是立刻寻找跟随try的except语句,并进入except包含的代码中执行。这就是异常的捕获。
而except 关键字里的 pass 表示虽然捕获了异常,但什么也不做;如果把 pass 改为 print 语句,那么就会输出其他信息。也就是说,这里也可以执行其他我们想要的逻辑,比如断开连接、关闭文件、释放资源、记录日志等常见的异常处理逻辑。这就是 Python 的异常捕获处理。
总结一下,try…catch…的使用方法如下:
- 把可能出现问题的代码,放在 try 中
- 把处理异常的代码,放在 except 中,异常发生时,系统会中断后续的代码执行,而进入except内的代码。
2.except 捕获多个异常
首先,我们知道,根据传递给except的异常类型,我们可以指定捕获处理特定的某一种异常,如下
try:
print(num)
except IOError:
print