文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

课时33:异常处理:你不可能总是对的2

2023-01-30 22:11

关注

目录:

  一、try-except语句

  二、try-finally语句

  三、raise语句

  四、课时33课后习题及答案

 

**********************

一、try-except语句

**********************

try-except语句格式如下:

try:
    检测范围
except Exception[as reason]:
    出现异常(Exception)后的处理代码

 try-except语句用于检测和处理异常,举个例子来说明这一切是如何操作的:

f = open("我为什么是一个文档.txt")
print(f.read())
f.close()

以上代码在“我为什么是一个文档.txt”这个文档不存在的时候,Python就会报错说文件不存在:

Traceback (most recent call last):
  File "C:\Users\14158\Desktop\lalallalalal.py", line 1, in <module>
    f = open("我为什么是一个文档.txt")
FileNotFoundError: [Errno 2] No such file or directory: '我为什么是一个文档.txt'

显然这样的用户体验很糟糕,因此可以这样修改:

try:
      f = open("我为什么是一个文档.txt")
      print(f.read())
      f.close()
except OSError:
      print("文件打开的过程出错啦")
      

上面的例子由于使用了大家习惯的语言来表达错误的信息,用户体验当然会好很多:

文件打开的过程出错啦

但是从程序员的角度来看,导致OSError异常的原因有很多(例如FileExistsError、FileNotFoundError等等),所以可能会更在意错误的具体内容,这里可以使用as把具体的错误信息给打印出来:

try:
      f = open("我为什么是一个文档.txt")
      print(f.read())
      f.close()
except OSError as reason:
      print("文件打开的过程出错啦,错误的原因是:" + str(reason))
      
      
文件打开的过程出错啦,错误的原因是:[Errno 2] No such file or directory: '我为什么是一个文档.txt'

 

1、针对不同异常设置多个except

一个try语句还可以和多个except语句搭配,分别对感兴趣的异常进行检测处理:

try:
      sum = 1 + '1'
      f = open("我是一个不存在的文档.txt")
      print(f.read())
      f.close()
except OSError as reason:
      print("文件打开的过程出错啦,错误的原因是:" + str(reason))
except TypeError as reason:
      print("文件打开的过程出错啦,错误的原因是:" + str(reason))
      
      
文件打开的过程出错啦,错误的原因是:unsupported operand type(s) for +: 'int' and 'str'

 

2、对多个异常统一处理

except后边还可以跟多个异常,然后对这些异常进行统一的处理:

try:
      int("abc")
      sum = 1 + "1"
      f = open("我是一个不存在的文档.txt")
      print(f.read())
      f.close()
except (OSError,TypeError):
      print("文件打开的过程出错啦,错误的原因是:" + str(reason))
      
      
Traceback (most recent call last):
  File "C:\Users\14158\Desktop\lalallalalal.py", line 2, in <module>
    int("abc")
ValueError: invalid literal for int() with base 10: 'abc'

 

3、捕获所有的异常

如果你无法确定要对哪一类异常进行处理,只是希望在try语句块里一旦出现异常,可以给用户一个“看得懂”的提醒,那么可以这么做。

............

except:

  print("出错了~")

............

不过通常不建议这么做,因为它会隐藏所有程序员未想到并且未做好处理准备的错误,例如当用户输入ctrl+C试图终止程序,却被解释为KeyboardInterrupt异常。另外要注意的是,try语句检测范围内一旦出现异常,剩下的语句将不会执行。

 

*********************

二、try-finally语句

*********************

 如果“我是一个不存在的文档”确实存在,open()函数正常返回文件对象,但异常却发生在成功打开文件后的sum = 1 + “1”语句上。此时python将直接跳转到except语句,也就是说,文件被打开了,但并没有执行关闭的命令:

try:
      f = open("我是一个不存在的文档.txt")
      print(f.read())
      sum = 1 + "1"
      f.close()
except:
      print("出错啦")       

为了实现像这种“就算出现异常,但不得不执行的收尾工作(比如在程序崩溃前保存用户文档)”,引入了finally来扩展try:

try:
      f = open("我是一个不存在的文档.txt")
      print(f.read())
      sum = 1 + "1"
except:
      print("出错啦")
finally:
      f.close()

如果try语句块中没有出现任何运行时出现的错误,会跳过except语句执行finally语句块的内容。如果出现异常,则会先执行except语句块的内容再执行finally语句块的内容。总之,finally语句块中的内容就是确保无论如何都将被执行的内容。

 

****************

三、raise语句

****************

 也许会问,我的代码能不能自己抛出一个异常呢?答案是可以的,可以使用raise语句抛出一个异常:

>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError

抛出的异常还可以带参数,表示异常的解释:

>>> raise ZeroDivisionError("除数不能为零!")
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise ZeroDivisionError("除数不能为零!")
ZeroDivisionError: 除数不能为零!

 

*******************************

四、课时33课后习题及答案

*******************************

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯