FishC笔记—33 讲 异常处理:你不可能总是对的2

来源:互联网 发布:pc蛋蛋机器人源码 编辑:程序博客网 时间:2024/06/05 16:22

本期内容详解:
try语句:

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

try-finally语句:

try:      检测范围  except Exception[as reason]:      出现异常(Exception)后的处理代码  finally:      无论如何都会被执行的代码

raise语句:
raise 异常的名字

>>> raise ZeroDivisionError('除数为零的异常')  <span style="color:#ff0000;">Traceback (most recent call last):    File "<pyshell#0>", line 1, in <module>      raise ZeroDivisionError('除数为零的异常')  ZeroDivisionError: 除数为零的异常</span>  >>>  

典型课后题
我们使用什么方法来处理程序中出现的异常?`

答:使用 try……except 搭配来捕获处理程序中出现的异常。

try:        检测范围来自:bbs.fishc.comexcept Exception[as reason]:        出现异常(Exception)后的处理代码

一个 try 语句可以和多个 except 语句搭配吗?为什么?

答:可以。因为 try 语句块中可能出现多类异常,利用多个 except 语句可以分别捕获并处理我们感兴趣的异常。

try:      sum = 1 + '1'      f = open('我是一个不存在的文档.txt')      print(f.read())      f.close()  except OSError as reason:      print('文件出错啦T_T\n错误原因是:' + str(reason))  except TypeError as reason:      print('类型出错啦T_T\n错误原因是:' + str(reason)) 

你知道如何统一处理多类异常吗?

答:在 except 后边使用小括号“()”把多个需要统一处理的异常括起来:

    try:          int('abc')          sum = 1 + '1'          f = open('我是一个不存在的文档.txt')          print(f.read())          f.close()      except (OSError, TypeError):          print('出错啦T_T\n错误原因是:' + str(reason))  

except 后边如果不带任何异常类,Python 会捕获所有(try 语句块内)的异常并统一处理,但小甲鱼却不建议这么做,你知道为什么吗?

答:因为它会隐藏所有程序员未想到并且未做好准备处理的错误,例如用户输入ctrl+c试图终止程序会被解释为KeyboardInterrupt异常。

如果异常发生在成功打开文件后,Python 跳到 except 语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?

答:我们可以使用 finally 语句来实现,如果 try 语句块中没有出现任何运行时错误,会跳过 except 语句块执行 finally语句块的内容。

如果出现异常,则会先执行 except 语句块的内容再接着执行 finally 语句块的内容。总之,finally 语句块里的内容就是确保无论如何都将被执行的内容!

请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。
代码:

输出:

参考答案:

    try:          for i in range(3):              for j in range(3):                  if i == 2:                      raise KeyboardInterrupt                  print(i, j)      except KeyboardInterrupt:          print('退出啦!')  

还记得我们第一个小游戏吗?只要用户输入非整型数据,程序立刻就会蹦出不和谐的异常信息然后崩溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。)

答:这里对可能导致异常的 guess = int(temp) 进行监测

    import random      secret = random.randint(1,10)      print('------------------我爱鱼C工作室------------------')      temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")      try:              guess = int(temp)      except ValueError:          print('输入错误!')          guess = secret      while guess != secret:          temp = input("哎呀,猜错了,请重新输入吧:")          guess = int(temp)          if guess == secret:              print("我草,你是小甲鱼心里的蛔虫吗?!")              print("哼,猜中了也没有奖励!")          else:              if guess > secret:                  print("哥,大了大了~~~")              else:                  print("嘿,小了,小了~~~")      print("游戏结束,不玩啦^_^")  

input() 函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键 Ctrl+d 产生)和 KeyboardInterrupt(取消输入,当用户按下组合键 Ctrl+c 产生),再次修改上边代码,捕获处理 input() 的两类异常,提高用户体验。

    import random      secret = random.randint(1,10)      print('------------------我爱鱼C工作室------------------')      try:          temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")              guess = int(temp)      except (ValueError, EOFError, KeyboardInterrupt):          print('输入错误!')          guess = secret      while guess != secret:          temp = input("哎呀,猜错了,请重新输入吧:")          guess = int(temp)          if guess == secret:              print("我草,你是小甲鱼心里的蛔虫吗?!")              print("哼,猜中了也没有奖励!")          else:              if guess > secret:                  print("哥,大了大了~~~")              else:                  print("嘿,小了,小了~~~")      print("游戏结束,不玩啦^_^")  

尝试一个新的函数 int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。
程序实现如图:

    def int_input(prompt=''):          while True:              try:                  int(input(prompt))                  break              except ValueError:                  print('出错,您输入的不是整数!')      int_input('请输入一个整数:')  

把文件关闭放在 finally 语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在”My_File.txt”这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?

    try:          f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T          print(f.read())      except OSError as reason:          print('出错啦:' + str(reason))      finally:      f.close()  

答:由于finally语句块里试图去关闭一个并没有成功打开的文件,因此会弹出错误内容如下:

    >>> 出错啦:[Errno 2] No such file or directory: 'My_File.txt'      Traceback (most recent call last):        File "C:\Users\FishC000\Desktop\test.py", line 7, in <module>          f.close()      NameError: name 'f' is not defined  

我们这么修正:

    try:          f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T          print(f.read())      except OSError as reason:          print('出错啦:' + str(reason))      finally:          if 'f' in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功              f.close()  
0 0