美文网首页
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之异常捕获

    我们在写代码的时候,可能会出现代码错误,抛出异常,导致整个程序就挂掉了,从而后面的代码也无法执行。所以对代码异常错...

  • iOS 异常捕获处理机制(初级篇)

    一、异常处理简介 二、异常捕获案例 使用@try catch捕获异常 例1是最简单的一种写法: 捕获异常之嵌套捕获...

  • Python面向对象2

    异常 捕获异常image.png根据错误类型捕获异常image.png 未知错误捕获image.png 捕获异常完...

  • 工作总结-002

    异常捕获service捕获业务异常,自定义BaseException;interface捕获业务异常,以及其他异常...

  • C++学习第20课,异常

    1 异常 一句话概括:捕获异常 1.1 谁捕获异常?捕获谁? A捕获B A() { try{ B(); } ...

  • Python 面向对象 - 08 异常

    目录一、概念二、捕获异常2.1 简单的捕获异常语法2.2 错误类型捕获2.3 异常捕获完整语法三、异常的传递四、抛...

  • springboot 异常捕获和处理

    springboot 异常捕获和处理 异常捕获处理

  • python3.7异常小记

    首先上示例代码: 这段代码包含了,异常分支类型捕获,无异常捕获,有无异常都会捕获的执行逻辑。 捕获全局异常 对入口...

  • Python异常处理

    Python异常处理 一、捕获异常 1.异常捕获语法 2.错误类型捕获 except:处理所有异常。except ...

  • 自定义异常捕获 与 自定返回json 数据格式

    1. 自定义异常捕获 自定的异常 2 捕获异常 =================================...

网友评论

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

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