首页 > 代码库 > 《Python核心编程》 第十章 错误和异常

《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语句检测和处理异常. 你也可以添加一个可选的 else 子句处理没
有探测到异常的时执行的代码. 而 try-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 safe_open(name = None, mode=r):    try:        f =open(name,mode)    except IOError:        f = None    else:        return f    if __name__ == "__main__":    f = safe_open(1.txt)    print f

运行结果:

 略

  


10–7. 异常. 下面两段 Python 伪代码 a)和 b) 有什么区别? 考虑语句 A 和 B 的上下
文环境. (这么细致的区别要感谢 Guido )
(a) try:
statement_A
except . . .:
. . .
else:
statement_B
(b) try:
statement_A
statement_B
except . . .:
. . .

 

  


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(prompt):    try:        f = raw_input(prompt)    except EOFError,KeyboardInterrupt:        f = None    return f        if __name__ == "__main__":    f = safe_input(input:)    print f

 


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

 答:

import mathimport cmathdef safe_sqrt(num):    try:        ret = math.sqrt(num)    except ValueError:        ret = cmath.sqrt(num)    return retif __name__ == "__main__":    print safe_sqrt(4)    print safe_sqrt(-4)