第十章是关于错误和异常的,对于程序开发来说异常虽然不是重点,但学会处理和利用异常对整个程序的设计和代码的书写都会事半功倍。
第九章练习解析:传送门
第一题:
引发异常. 以下的哪个因素会在程序执行时引发异常? 注意这里我们问的并不是异
常的原因.
a) 用户
b) 解释器
c) 程序
d) 以上所有
e) 只有 b) 和 c)
f) 只有 a) 和 c)
答:f
第二题:
引发异常. 参考上边问题的列表, 哪些因素会在执行交互解释器时引发异常?
答:f
第三题:
关键字. 用来引发异常的关键字有那些?
答:raise
第四题:
关键字. try-except 和 try-finally 有什么不同?
答:try-except是用来捕获异常的,而try-finally并不捕获异常,它是用来维持一致的行为而无论异常是否发生。就是说无论异常是否发生,finally的代码都会被执行。
第五题:
异常. 下面这些交互解释器下的 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 语法错误,多余的then
(b):IndexError: list index out of range 参数错误,aList列表的索引参数超出范围
(c):NameError: name ‘x’ is not defined 名称错误,变量x未定义
(d):ZeroDivisionError: integer division or modulo by zero 浮点溢出错误,0不能作为分母
(e):ValueError: math domain error 数值错误,不能对-1开方
第六题:
改进的 open(). 为内建的 open()函数创建一个封装. 使得成功打开文件后, 返回文件句柄; 若打开失败则返回给调用者 None , 而不是生成一个异常. 这样你打开文件时就不需要额外的异常处理语句.
#-*- coding:utf-8 -*- def myopen(fname,fmode='r'): try: f = open(fname,fmode) except IOError: f = None return f if __name__=="__main__": f = myopen('1.txt') print f
第七题:
异常. 下面两段 Python 伪代码 a)和 b) 有什么区别? 考虑语句 A 和 B 的上下
文环境. (这么细致的区别要感谢 Guido )
(a)
try:
statement_A
except . . .:
. . .
else:
statement_B
(b)
try:
statement_A
statement_B
except . . .:
. . .
答:当statement_B出错的话(a)程序会报错,而(b)程序会被except语句处理
第八题:
改进的 raw_input() . 本章的开头, 我们给出了一个”安全”的 float() 函数,它建立在内建函数 float() 上,可以检测并处理 float()可能会引发的两种不同异常. 同样,raw_input() 函数也可能会生成两种异常, EOFError (文件末尾 EOF,在 Unix 下是由于按下了Ctrl+D 在 Dos 下是因为 Ctrl+Z)或是 KeyboardInterrupt(取消输入, 一般是由于按下了Ctrl+C). 请创建一个封装函数 safe_input() , 在发生异常时返回 None .
#-*- coding:utf-8 -*- def safe_input(content): try: text = raw_input(content) except EOFError,KeyboardInterrupt: text = None return text if __name__ == "__main__": text = safe_input('Please input:') print text
第九题:
改进的 math.sqrt(). math 模块包含大量用于处理数值相关运算的函数和常量. 不幸的是, 它不能识别复数, 所以我们创建了 cmath 模块来支持复数相关运算. 请创建一个 safe_sqrt() 函数, 它封装 math.sqrt() 并能处理负值, 返回一个对应的复数.
#-*- coding:utf-8 -*- import math,cmath def mysqrt(num): try: anwser = math.sqrt(num) except TypeError: anwser = cmath.sqrt(num) return anwser if __name__=="__main__": key = input() print mysqrt(key)