• 小甲鱼Python第033讲:异常处理:你不可能总是对的2| 课后测试题及参考答案


    测试题:

    0.我们使用什么方法来处理程序中出现的异常?

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

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

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

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

    1 try:
    2     sum = 1+'1'
    3     f = open('我是一个不存在的文档.txt')
    4     print(f.read)
    5     f.close()
    6 except OSError as reason:
    7     print("文件出错了
    错误原因是:" + str(reason))
    8 except TypeError as reason:
    9     print("类型出错了
    错误原因是:" + str(reason))

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

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

    1 try:
    2     int("abc")
    3     sum = 1+'1'
    4     f = open('我是一个不存在的文档.txt')
    5     print(f.read)
    6     f.close()
    7 except (OSError,TypeError) as reason:
    8     print("出错了
    错误原因是:" + str(reason))

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

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

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

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

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

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

    实现代码: 

    1 try:
    2     for i in range(3):
    3         for j in range(3):
    4             if i == 2:
    5                 raise KeyboardInterrupt
    6             print(i,j)
    7 except KeyboardInterrupt:
    8     print("退出了!")

    动动手:

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

    猜数字小游戏:

     1 import random
     2 
     3 secret = random.randint(1,10)
     4 print("--------------------小鱼儿工作室-------------------")
     5 temp= input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
     6 guess = int(temp)
     7 while guess != secret:
     8     temp = input("哎呀,猜错了。请重新输入吧:")
     9     guess = int(temp)
    10     if guess == secret:
    11         print("WC,你是小甲鱼心里的蛔虫吗?!")
    12         print("猜中了呢!")
    13     else:
    14         if guess >secret:
    15             print("哥,大了大了")
    16         else:
    17             print("嘿,小了小了")
    18 print("游戏结束,不玩了~~")

    优化代码:主要在guess= int(temp)上当输入的temp不是整数型的时候,会出现异常。

     1 import random
     2 
     3 secret = random.randint(1,10)
     4 print("--------------------小鱼儿工作室-------------------")
     5 temp= input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
     6 try:
     7     guess = int(temp)
     8 except ValueError:
     9     print("输入错误,请输入整数。")
        guess = secret
    10 while guess != secret: 11 temp = input("哎呀,猜错了。请重新输入吧:") 12 guess = int(temp) 13 if guess == secret: 14 print("WC,你是小甲鱼心里的蛔虫吗?!") 15 print("猜中了呢!") 16 else: 17 if guess >secret: 18 print("哥,大了大了") 19 else: 20 print("嘿,小了小了") 21 print("游戏结束,不玩了~~")

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

    实现代码:

     1 import random
     2 
     3 secret = random.randint(1,10)
     4 print("--------------------小鱼儿工作室-------------------")
     5 try:
     6     temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
     7     guess = int(temp)
     8 except (EOFError, KeyboardInterrupt, ValueError):
     9     print("输入错误,请输入整数。")
    10     guess = secret
    11 while guess != secret:
    12     temp = input("哎呀,猜错了。请重新输入吧:")
    13     guess = int(temp)
    14     if guess == secret:
    15         print("WC,你是小甲鱼心里的蛔虫吗?!")
    16         print("猜中了呢!")
    17     else:
    18         if guess >secret:
    19             print("哥,大了大了")
    20         else:
    21             print("嘿,小了小了")
    22 print("游戏结束,不玩了~~")

    2.尝试一个新的函数int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。

    程序实现如图:

    方法一:

    1 def int_input(prompt):
    2     while True:
    3         try:
    4             int(input(prompt))
    5             break
    6         except ValueError:
    7             print("出错,您输入的不是整数!")
    8 
    9 int_input("请输入一个整数:")

    方法二:

    1 def  int_input1():
    2     temp = input("请输入一个整数:")
    3     try :
    4         num = int(temp)
    5     except ValueError:
    6         print("出错了~~!!")
    7         int_input1()
    8 int_input1()

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

    1 try:
    2     f = open('My_File.txt')
    3     print(f.read())
    4 except OSError as reason:
    5     print("出错了:"+str(reason))
    6 finally:
    7 f.close()

    优化代码:

    1 try:
    2     f = open ("My_File.txt") # 当前文件夹中并不存在“My_File.txt”这个文件
    3     print(f.read())
    4 except OSError as reason:
    5     print("出错了:" +str(reason))
    6 finally:
    7     if 'f' in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功
    8         f.close()
  • 相关阅读:
    [转贴] 2016一月12日起.NET 4, 4.5 and 4.5.1 停止安全更新、技术支持 or hotfix
    Windows Azure 入门 -- VS 2015部署 ASP.NET网站(项目) 与 数据库
    [职场]工作多久才能换工作?下一个工作年薪该多高?
    [转贴] ASP.NET -- Web Service (.asmx) & JSON
    ADO.NET #3-1 (GridView + DataReader + SqlCommand)完全手写Code Behind
    File 与 Log #3--动态加入控件,[图片版]访客计数器(用.txt档案来记录)
    小图示优化
    GridView的 PreRender事件与范例--GridView + CheckBox,点选多列资料(复选删除)
    [习题] FindControl 简单练习--GridView + CheckBox,点选多列数据(复选删除)#3 List或数组
    GridView的 PreRender事件与 RowCreated、RowDataBound事件大乱斗
  • 原文地址:https://www.cnblogs.com/IT-NXXB/p/13399264.html
Copyright © 2020-2023  润新知