美文网首页
2021-02-21python之异常捕获

2021-02-21python之异常捕获

作者: testerPM | 来源:发表于2021-02-23 09:50 被阅读0次

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

    下面来看一段代码:

    # -- 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

    相关文章

      网友评论

          本文标题:2021-02-21python之异常捕获

          本文链接:https://www.haomeiwen.com/subject/ryjqfltx.html