2021-02-21python之异常捕获

2021-02-23  本文已影响0人  testerPM

我们在写代码的时候,可能会出现代码错误,抛出异常,导致整个程序就挂掉了,从而后面的代码也无法执行。
所以对代码异常错误,我们就要用到代码异常捕获,避免程序崩溃,后面的代码可以正常执行。

下面来看一段代码:

# -- 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]:
     获取到异常时的处理

  1. except 语句不是必须的,finally语句也不是必须的。但是二者必须要有一个,否则就没有try的意义了
  2. 不建议在不清楚逻辑的情况下捕获所有异常,有可能会隐藏了很严重的问题
    注意:程序异常处理用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 (可以捕获所有错误)

  1. 错误捕获产生的问题就是当你做单元测试的时候,代码其实存在错误,但是你又处理掉了,那么代码全部都是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.png
image.png
image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读