10-1.引发异常。以下哪个因素会在程序执行时引发异常?
a.用户 b.解释器 c.程序 d.以上所有 e.只有b和c f.只有a和c
答案是f
10-2.引发异常。参考上边问题的列表,哪些因素会在执行交换器时引发异常?
用户输入和程序异常
10-3.关键字。用来引发异常的关键字有哪些?
raise。
10-4.关键字。try-except和try-finally有什么不同?
try语句至少要有一个except语句,而finally语句是可选的。
try-except语句定义了进行异常监控的一段代码,并且提供了处理异常的机制,如果try语句中出现异常,则try之后的语句都不再运行,转入except语句捕捉异常。
而try-finally语句,不管是否出现异常,finally中的语句总会运行,它常常用来维持一致的行为而无论异常是否发生。
10-5.异常。下面这些交互解释器下的Python代码段分别会引发什么异常
a.SyntaxError:Python解释器语法错误,表示Python代码中有一个不正确的结构。
>>> if 3 < 4 then:print '3 IS less than 4!' File "<stdin>", line 1 if 3 < 4 then:print '3 IS less than 4!' ^ SyntaxError: invalid syntaxb.IndexError:请求的索引超出序列范围
>>> aList = ['Hello', 'World', 'Anyone', 'Home?'] >>> print 'the last string in aList is: ', aList[len(aList)] the last string in aList is: Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
c.NameError:尝试访问一个未申明的变量
>>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not definedd.ZeroDivisionError:除数为0
>> x = 4 % 0
Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero
e.ValueError:值错误,-1不能开平方
>>> i = math.sqrt(-1) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: math domain error
10-6.改进的open()。为内建的open()函数创建一个封装。使得成功打开文件后,返回文件句柄;若打开失败则返回给调用者None,而不是生成一个异常。
def safe_open(): try: f = open('xxx.txt') f.close() except Exception: return None print(safe_open())
10-7.异常。下面两段Python伪代码a和b有什么区别?考虑语句A和B的上下文环境。
(a) try:
statement_A
except . . .:
. . .
else:
statement_B
(b) try:
statement_A
statement_B
except . . .:
. . .
若statement_A语句发生错误,则a和b中的B语句都不能运行;若B语句发生错误,则b中的except语句能捕获这个错误,不会终止程序,而a语句则被终止程序运行,同时显示错误信息。
10-8.改进的raw_input()。
def safe_raw_input(): try: prompt = 'Input whatever: ' raw_input(prompt) except EOFError, KeyboardInterrupt: return None print(safe_raw_input())
10-9.改进的math.sqrt()。
import math, cmath def safe_math_sqrt(num): try: p = math.sqrt(num) return p except ValueError: p = cmath.sqrt(num) return p if __name__ == '__main__': num = int(raw_input('Input a number: ')) print(safe_math_sqrt(num))