Python核心编程(第二版)第十章习题答案

10.1 引发异常。以下的哪个因素会在程序执行时引发异常?注意这里我们问的并不是异常的原因。

    a)用户;

    b)解释器;

    c)程序;

    d)以上所有;

    e)只有b)和c);

    f)只有a)和c)。

 

答案:f

 

10-2.引发异常。参考上边问题的列表,哪些因素会在执行交互解释器时引发异常?

答案:f

 

10-3.关键字。用来引发异常的关键字有哪些?

答案:raise

 

10-4.关键字。try-except和try-finally有什么不同?

答案:

try-except:当try代码块运行出错,except代码块才会被执行(匹配到相应异常时),处理完异常后try-except后的代码会继续往下执行;

try-finally:不管try代码块是否出现异常,最终都会执行finally里的代码。如果出现异常,执行完finally代码块后,异常会继续往上层抛。

 

10-5.异常。下面这些交互解释器下的Python代码段分别会引发什么异常(参阅表10.2给出的内建异常清单):

    (a)>>>if 3 < 4 then:print '3 is less than 4!'

    (b)>>>aList = ['Hello','World','Anyone','Home?']

    >>>print 'the last string in aList is: ',aList[len(aList)]

    (c)>>>x

    (d)>>>x = 4 % 0

    (e)>>>import math

>>>i = math.sqrt(-1)

答案:

(a)SyntaxError: invalid syntax

(b)IndexError: list index out of range

(c)NameError: name 'x' is not defined

(d)ZeroDivisionError: integer division or modulo by zero

(e)ValueError: math domain error

 

10-6.改进的open()。为内建的open()函数创建一个封装。使得成功打开文件后,返回文件句柄:若打开失败则返回给调用者None,而不是生成一个异常。这样你打开文件就不需要额外的异常处理语句。

答案:

def try_open(filename,mode = 'r'):

    try:

        f = open(filename,mode)

    except IOError:

        return None

    return f

 

if __name__ == "__main__":

    print try_open('test1.txt')

 

10-7.异常。下面两端Python伪代码a)和b)有什么区别?考虑语句A和B的上下文环境。(这么细致的区别要感谢Guido!)

 (a)

try:

    statement_A

except . . .:

    . . .

else:

    statement_B

(b)

try:

    statement_A

    statement_B

except . . .:

    . . .

答案:

情况1:

    如果statement_A执行出错,则(a)和(b)都不会执行statement_B;

情况2:

    如果statement_A执行正常,则(a)和(b)都会执行statement_B——但是,如果statement_B的执行也出错,(b)可以在except子句里捕获到异常并做处理,而(a)则只能将statement_B产生的异常抛给上层调用者。

 

10–8.改进的raw_input()。本章的开头,我们给出了一个”安全”的float()函数,它建立在内建函数float()上,可以检测并处理float()可能会引发的两种不同异常。同样,raw_input()函数也可能会生成两种异常,EOFError(文件末尾EOF,在Unix下是由于按下了Ctrl+D在Dos下是因为Ctrl+Z)或是KeyboardInterrupt(取消输入,一般是由于按下了Ctrl+C)。请创建一个封装函数safe_input(),在发生异常时返回None。

答案:

def safe_input(example):

    symbol = None

    try:

        symbol = raw_input(example)

    except (EOFError, KeyboardInterrupt):

        pass

    return symbol

 

if __name__ == '__main__':

    print safe_input('please input: ')

 

10-9.改进的math.sqrt()。math模块包含大量用于处理数值相关运算的函数和常量。不幸的是,它不能识别复数,所以我们创建了cmath模块来支持复数相关运算。请创建一个safe_sqrt()函数,它封装math.sqrt()并能处理负值,返回一个对应的复数。

答案:

import math, cmath

 

def safe_sqrt(x):

try:

    num = math.sqrt(x)

except ValueError:

    num = cmath.sqrt(x)

return num

 

if __name__ == "__main__":

    x = float(raw_input('please input a number: '))

    print safe_sqrt(x)

 

说明:内容为网络爬虫练习所得,如侵权,请联系删除

posted on 2021-02-05 18:00  AlphaRobot  阅读(172)  评论(0编辑  收藏  举报

导航