Python标准异常总结:
课后习题及答案:
0.结合你自身的编程经验,总结下异常处理几只的重要性?
由于韩静的不确定性和用户操作的不可预知性都可能导致程序出现各种问题,因此异常机制最重要的就是:增强程序的健壮性和用户体验,金肯的捕获所有预知的异常并写好处理的代码,当异常出现的时候,程序自动消化并恢复正常(不至于崩溃)。
1.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [1, 2, 3, 4,,]
会语法报错:SyntaxError:invalid syntax
2.请问一下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [1, 2, 3, 4, 5]
>>> print(my_list[len(my_list)])
会出现索引异常。len(my_list)函数用来获取列表的长度,所以len(my_list)为5,由于列表的索引是从0开始的,即各元素的索引为[0, 1, 2, 3, 4],因此访问my_list(5)会引发IndexError:list index out of range异常。
3.请问一下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [3, 5, 1, 4, 2]
>>> my_list.sorted()
会引发异常,因为列表排序应该是list.sort(),而sorted()是内置方法BIF,故会引发AttributeError: 'list' object has no attribute 'sorted'异常。
4.请问一下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_dict = {'host': 'http://bbs.fishc.com', 'port': '80'}
>>> print(my_dict['server'])
尝试访问一个字典中不存在的“键”引发KeyError:'server'异常。通过使用dict.get()可避免该异常:
if not my_dict.get('server'):
print('您所访问的键【server】不存在!')
5. 请问一下代码是否会产生异常,如果会的话,请写出异常的名称:
def my_fun(x, y):
print(x, y)
my_fun(x=1, 2)
若使用关键字参数,则需两个参数均使用关键字参数,正确形式应为my_fun(x=1,y=2)。当然my_fun(1, 2)也是正解。
6. 请问一下代码是否会产生异常,如果会的话,请写出异常的名称:
f = open('C:\\test.txt', wb)
f.write('I love FishC.com!\n')
f.close()
open(file,mode = 'r'),该函数的第二个参数是字符串,故正确打开可写文件应为f = open('C:\\test.txt', 'wb')。wb不加双引号,python还以为是变量名,往上一找没找到....引发NameError异常。若文件打开失败,后面与f相关的均会报同样异常。
7. 请问一下代码是否会产生异常,如果会的话,请写出异常的名称:
def my_fun1():
x = 6
def my_fun2():
x *= x
return x
return my_fun2()
my_fun1()
回想前面学过的遇到同名局部变量时,python会有屏蔽机制来保护局部变量。在my_fun2()中也有个局部变量x,故外部变量x=5被屏蔽,所以在执行x *= x的时候,根本找不到x的值,故报错。
在Python3前没有直接解决方法,只能间接的通过容器类型来存放,因为容器类型不是放在栈里,所以不会被屏蔽。还记得容器类型这个词么?字符串、元组、列表都可以扔进去的就是容器。
于是代码改造如下:
>>> def my_fun1():
x = [6]
def my_fun2():
x[0] *= x[0]
return x[0]
return my_fun2()
>>> my_fun1()
36
但是在python3中又有很大改进,还记得关键字nonlocal吗?它可以帮助我们在内部函数里修改外部函数里的局部变量的值:
>>> def my_fun1():
x = 6
def my_fun2():
nonlocal x
x *= x
return x
return my_fun2()
>>> my_fun1()
36