2021-02-21python之异常捕获
我们在写代码的时候,可能会出现代码错误,抛出异常,导致整个程序就挂掉了,从而后面的代码也无法执行。
所以对代码异常错误,我们就要用到代码异常捕获,避免程序崩溃,后面的代码可以正常执行。
下面来看一段代码:
# -- coding: utf-8 --
def score(s=input("请输入你的分数:")):
if 90 <= int(s) <= 100:
print("恭喜你,优秀")
elif 80 <= int(s) < 90:
print("恭喜你,良好")
else:
print("很遗憾,不及格")
score()
执行上面代码:输入非数字的英文字母,代码报错(原因:字母不能转成int)
image.png
所以我们写代码过程中,为了避免让程序挂掉,怎么办呢?---》需要用到异常捕获
异常处理
语法一:
与第三方资源交互,资源获取和释放-异常,通常会使用这种语法(except语句可以没有)
try:
代码段
except [Exception as e]:
获取到异常时的处理
finally:
无论有没有异常都要执行的代码
语法二:
try:
代码段
except [Exception as e]:
获取到异常时的处理
- except 语句不是必须的,finally语句也不是必须的。但是二者必须要有一个,否则就没有try的意义了
- 不建议在不清楚逻辑的情况下捕获所有异常,有可能会隐藏了很严重的问题
注意:程序异常处理用if判断来过滤内部错误。
下面分别演示2中语法的用法:
(1)try.....except
except不加错误基类
def score (s=input("请输入你的分数:")):
try:
if 90<=int(s)<=100:
print("恭喜你,优秀")
elif 80<=int(s)<90:
print("恭喜你,良好")
else:
print(”很遗憾,不及格")
except:
print("代码出错了")
score()
执行结果:
E:\pythonProject\venv\Scripts\python.exe E:/pythonProject/scriptDeal.py
请输入你的分数:d
代码出错了
Process finished with exit code 0
image.png
except加错误基类
except如果加上指定的错误基类,那么try就只捕获指定的错误类型,只有捕捉到指定的错误类型,才会执行except下面的代码。如果没有捕获到指定的错误类型,但是这段代码发生了其他错误类型,那么程序一样报错,导致程序终止运行。
比如:
def score (s=input("请输入你的分数:")):
try:
if 90<=int(s)<=100:
print("恭喜你,优秀")
elif 80<=int(s)<90:
print("恭喜你,良好")
else:
print(”很遗憾,不及格")
except KeyError:#这里应该是:ValueError
print("代码出错了")
score()
如上面代码:except 捕捉的错误类型是KeyError,而导致代码报错的错误类型是ValueError(参数传入错误)导致的。那么上面代码执行时,程序依然会报错。
将捕获到的错误保存到一个变量
def score (s=input("请输入你的分数:")):
try:
if 90<=int(s)<=100:
print("恭喜你,优秀")
elif 80<=int(s)<90:
print("恭喜你,良好")
else:
print(”很遗憾,不及格")
except ValueError as e :#这里e是个变量,你也可以定义成其他变量,不过一般大家都用e
print("代码出错了,错误信息是:%s"%e)
score()
执行结果:
E:\pythonProject\venv\Scripts\python.exe E:/pythonProject/scriptDeal.py
请输入你的分数:y
代码出错了,错误信息是:invalid literal for int() with base IO:'y'
Process finished with exit code 0
从执行结果可以看到:捕获到的错误保存到变量,控制台可以打印出具体的错误信息。
备注:
1.当你不知道错误基类是什么的时候,except 后面直接写 Exception (可以捕获所有错误)
- 错误捕获产生的问题就是当你做单元测试的时候,代码其实存在错误,但是你又处理掉了,那么代码全部都是pass---->这个时候怎么办呢?答案:使用
raise关键字,将错误抛出来。比如下面代码:
def score (s=input("请输入你的分数:")):
try:
if 90<=int(s)<=100:
print("恭喜你,优秀")
elif 80<=int(s)<90:
print("恭喜你,良好")
else:
print(”很遗憾,不及格")
except ValueError as e :#这里e是个变量,你也可以定义成其他变量,不过一般大家都用e
print("代码出错了,错误信息是:%s"%e)
raise e
score()
执行结果:可以看到抛出的错误与不加捕获抛出的错误是一样的,但是不影响代码继续执行。后面的代码是可以继续执行的。(把错误抛出来,在做单元测试时,就不会所有都是pass了)
image.png(2) try.....except......finally
try :
file=open("E:\\pythonProject\\Newtest.txt")#目录下不存在这个文件,这段代码一定会报错
print(file.read())
except Exception as e:
print("出错了,错误是:%s"%e)
finally:#不管上面代码是正确还是错误,我都要关闭文件
file.close()
print(file.closed)
上面代码执行结果:
image.png从上面的错误结果可以看到finally里面的代码也报错了(如果后面还有代码,后面的代码无法执行。所以,finally里面也要加try)
代码如下:
try :
file=open("E:\\pythonProject\\Newtest.txt")#目录下不存在这个文件,这段代码一定会报错
print(file.read())
except Exception as e:
print("出错了,错误是:%s"%e)
finally:#不管上面代码是正确还是错误,我都要关闭文件
try:
file.close()
print(file.closed)
except Exception as e:
print(e)
上面代码执行结果如下:
从下面错误结果[Error:2]可以看到捕获到了2处错误。
E:\pythonProject\venv\Scripts\python.exe E:/pythonProject/scriptDeal.py
出错了,错误是:[Error 2]:No such file or directory ""E:\\pythonProject\\Newtest.txt"
name 'file' is not defined
Process finished with exit code 0
总结:
1.try....except经常在处理文件的时候会用到
2.打开文件,必须要关闭文件,那么有没有办法可以自动关闭文件呢?---》答案:使用上下文管理器
上下文管理器
语法:
with open ('some_file','w') as opened_file:
opened_file.write('Hola!')
参考文章:
http://www.cnblogs.com/vamei/archive/2012/11/23/2772445.html
scriptDeal.py代码更新如下:
如下面代码:with...as file冒号下面的代码执行完了,文件便会自动关闭,无需手动关闭。
with open ('E:\\pythonProject\\Newtest.txt','a+') as file:
file.write('Hola!')
都有哪些错误基类
当你不知道错误基类时,就统一用Exception。
image.pngimage.png
image.png
image.png