首页 > 代码库 > 《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)