小甲鱼Python第032讲:异常处理:你不可能总是对的| 课后测试题及参考答案
0.结合你自身的编程经验。总结下异常处理机制的重要性?
由于环境的不确定性和用户操作的不可预知性都可能导致程序出现各种问题,因此异常机制最重要无非就是:增强程序的健壮性和用户体验,尽可能的捕获所有预知的异常并没有写写好处理的代码,当异常出现的时候,编程自动消化并回复正常(不至于崩溃)。
1.请问一下代码是否会产生异常,如果会的话,请写出异常的名称。
1 >>> my_list = [1,2,3,4,,]
语法错误,无效语法。
SyntaxError: invalid syntax
2.请问一下代码是否会产生异常,如果会的话,请写出异常的名称。
1 >>> my_list = [1,2,3,4,5] 2 >>> print(my_list[len(my_list)])
索引错误。IndexError: list index out of range。
列表的索引值是从0开始的。len(my_list)是列表的长度,在该列表中,列表的长度len(my_list) = 5,但是my_list(index)是通过索引值查找列表元素,而其索引值最大为4。因此出现索引错误。
3.请问一下代码是否会产生异常,如果会的话,请写出异常的名称。
1 >>> my_list = [3,1,5,4,2] 2 >>> my_list.sorted()
列表的排序方法是list.sort()。sorted()是BIF(内置函数)。因此会发生AttributeError: 'list' object has no attribute 'sorted'异常。
4.请问一下代码是否会产生异常,如果会的话,请写出异常的名称。
1 >>> my_dict = {'host':'http://bbs.fishc.com','port':'80'} 2 >>> print(my_dict['server'])
字典中的key中没有'server',因此会引发KeyError: 'server'异常。为了避免这一异常发生,可以使用dict.get()方法。eg:
1 my_dict = {'host':'http://bbs.fishc.com','port':'80'} 2 if not my_dict.get('server'): 3 print("您所访问的键【server】不存在。") 4 else: 5 print(my_dict['server'])
5.请问一下代码是否会产生异常,如果会的话,请写出异常的名称。
1 def my_fun(x,y): 2 print(x,y) 3 f(x=1,2)
问题一:调用函数时,要保证函数名的正确性,上面函数没有正常调用。
问题二:如果想使用关键字参数,需要两个参数均使用关键字参数。
eg:
1 def my_fun(x,y): 2 print (x,y) 3 my_fun(1,2) #位置参数 4 my_fun(x=1,y=2)#关键字参数
6.请问一下代码是否会产生异常,如果会的话,请写出异常的名称。
1 f = open('C:\\test.txt',wb) 2 f.write('I love you \n') 3 f.close()
注意open()第二个参数是字符串,应该f = open('C:\\test.txt','wb')。wb不加双引号python会以为是变量名,往上一找,当没找到的时候会发生NameError异常。由于打开文件失败,接着下边一连串与f有关的均会报同样的异常。
7.请问一下代码是否会产生异常,如果会的话,请写出异常的名称。
1 def my_fun1(): 2 x=5 3 def my_fun2(): 4 x *=x 5 return x 6 return my_fun2() 7 my_fun1()
关于闭包问题,python认为在内部函数的X是局部变量的时候,外部函数的X就被屏蔽了起来,所以执行x *=x的时候,在右边根本就找不到局部变量x的值,因此报错。
在python3 之前没有周总结的解决方案,只能间接的通过容器类型来存放,因为容器类型不是放在栈里,所以不会被“屏蔽”掉。之前介绍过的字符串、列表、元组都可以放进容器类型。
修改方法一:
1 def my_fun1(): 2 x=[5] 3 def my_fun2(): 4 x[0] *= x[0] 5 return x[0] 6 return my_fun2() 7 my_fun1()
修改方法二:
在内部函数中可以修改外部函数李的局部变量的值,那么也有一个关键字可以使用,就是nonlocal:
1 def my_fun1(): 2 x=5 3 def my_fun2(): 4 nonlocal x 5 x *= x 6 return x 7 return my_fun2() 8 my_fun1()