小甲魚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()