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


    测试题:

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

    except XXXError:

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

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

    可以,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('文件出错啦T_T
    错误原因是:' + str(reason))
    8 except TypeError as reason:
    9     print('类型出错啦T_T
    错误原因是:' + 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):
    8     print('出错啦T_T
    错误原因是:' + str(reason))

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

    就是无法精确知道异常类型吧,异常的理由

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

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

    可以在except语句后加入finally,finally语句无论如何都会执行的

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

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

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

    从except语句可以看出是键盘主动干扰程序结束了,之前在Linux系统是用“Ctrl + C”,这里不知道是用了什么键

    答:这道题比较考脑瓜,你想到了吗?

    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('------------------我爱鱼C工作室------------------')
     5 temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
     6 guess = int(temp)
     7 while guess != secret:
     8     temp = input("哎呀,猜错了,请重新输入吧:")
     9     guess = int(temp)
    10     if guess == secret:
    11         print("我草,你是小甲鱼心里的蛔虫吗?!")
    12         print("哼,猜中了也没有奖励!")
    13     else:
    14         if guess > secret:
    15             print("哥,大了大了~~~")
    16         else:
    17             print("嘿,小了,小了~~~")
    18 print("游戏结束,不玩啦^_^")

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

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

    主要修改在6-10行,要加一行guess = secret(第10行)保证直接游戏结束

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

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

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

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

    3. 把文件关闭放在 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()

    AG:我看f.close并没有缩进呀,不是finally的语句吧

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

    >>> 出错啦:[Errno 2] No such file or directory: 'My_File.txt'
    Traceback (most recent call last):
      File "C:UsersFishC000Desktop	est.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()

    locals()表示当前局部变量符号表

    作者:Agiroy_70

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    博主的文章主要是记录一些学习笔记、作业等。文章来源也已表明,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。

    博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个无耻的文档搬运工!

  • 相关阅读:
    iOS API 概述
    iOS开发的一些奇巧淫技3
    iOS开发的一些奇巧淫技1&2
    iOS-一键拨号
    iOS层次架构
    简单block 和 代理
    iOS开发-单例GCD
    简单的归档、接档
    通知中心与本地通知
    安装linux centos 7.7 遇到 DRM:Pointer to TMDS table invalid
  • 原文地址:https://www.cnblogs.com/hale547/p/13298346.html
Copyright © 2020-2023  润新知