第032講:異常處理:你不可能總是對的
目錄
0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
0. 結合你自身的程式設計經驗,總結下異常處理機制的重要性?-
1. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:A
2. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:;5dLE?h{
3. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:mpWh:`s(M
4. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:?kKt^V}
5. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:1]}psG7
6. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:GJS{F
7. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:z?L x
0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
Python標準異常總結
AssertionError | 斷言語句(assert)失敗 |
AttributeError | 嘗試訪問未知的物件屬性 |
EOFError | 使用者輸入檔案末尾標誌EOF(Ctrl+d) |
FloatingPointError | 浮點計算錯誤 |
GeneratorExit | generator.close()方法被呼叫的時候 |
ImportError | 匯入模組失敗的時候 |
IndexError | 索引超出序列的範圍 |
KeyError | 字典中查詢一個不存在的關鍵字 |
KeyboardInterrupt | 使用者輸入中斷鍵(Ctrl+c) |
MemoryError | 記憶體溢位(可通過刪除物件釋放記憶體) |
NameError | 嘗試訪問一個不存在的變數 |
NotImplementedError | 尚未實現的方法 |
OSError | 作業系統產生的異常(例如開啟一個不存在的檔案) |
OverflowError | 數值運算超出最大限制 |
ReferenceError | 弱引用(weak reference)試圖訪問一個已經被垃圾回收機制回收了的物件 |
RuntimeError | 一般的執行時錯誤 |
StopIteration | 迭代器沒有更多的值 |
SyntaxError | Python的語法錯誤 |
IndentationError | 縮排錯誤 |
TabError | Tab和空格混合使用 |
SystemError | Python編譯器系統錯誤 |
SystemExit | Python編譯器程序被關閉 |
TypeError | 不同型別間的無效操作 |
UnboundLocalError | 訪問一個未初始化的本地變數(NameError的子類) |
UnicodeError | Unicode相關的錯誤(ValueError的子類) |
UnicodeEncodeError | Unicode編碼時的錯誤(UnicodeError的子類) |
UnicodeDecodeError | Unicode解碼時的錯誤(UnicodeError的子類) |
UnicodeTranslateError | Unicode轉換時的錯誤(UnicodeError的子類) |
ValueError | 傳入無效的引數 |
ZeroDivisionError | 除數為零 |
0. 結合你自身的程式設計經驗,總結下異常處理機制的重要性?-
答:由於環境的不確定性和使用者操作的不可以預知性都可能導致程式出現各種問題,因此異常機制最重要的無非就是:增強程式的健壯性和使用者體驗,儘可能的捕獲所有預知的異常並寫好處理的程式碼,當異常出現的時候,程式自動消化並恢復正常(不至於崩潰)。|j=N0AOq7p
xvHOIy5J,;|W#[($E.?w1
以下題目可以參考(http://bbs.fishc.com/thread-45814-1-1.html),但要求不使用IDLE直接獲得答案。
1. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:A
>>> my_list = [1, 2, 3, 4,,]
答:語法錯誤版權屬於:bbs.fishc.com
SyntaxError: invalid syntax^
2. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:;5dLE?h{
>>> my_list = [1, 2, 3, 4, 5]
>>> print(my_list[len(my_list)])
答:len(my_list) 是獲得列表的長度,這裡長度為5,該列表各個元素的訪問索引號分別是:[0, 1, 2, 3, 4],因此試圖訪問 my_list(5) 會引發 IndexError: list index out of range 異常。
3. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:mpWh:`s(M
>>> my_list = [3, 5, 1, 4, 2]
>>> my_list.sorted()
答:初學者容易疏忽的錯誤,列表的排序方法叫 list.sort(),sorted() 是BIF。因此會引發 AttributeError: 'list' object has no attribute 'sorted' 異常。H
4. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:?kKt^V}
>>> my_dict = {'host': 'http://bbs.fishc.com', 'port': '80'}
>>> print(my_dict['server'])
答:嘗試訪問字典中一個不存在的“鍵”引發 KeyError: 'server' 異常,為了避免這個異常發生,可以使用 dict.get() 方法:9Cb&
if not my_dict.get('server'):
print('您所訪問的鍵【server】不存在!')
5. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:1]}psG7
def my_fun(x, y):
print(x, y)
my_fun(x=1, 2)
答:如果使用關鍵字引數的話,需要兩個引數均使用關鍵字引數 my_fun(x=1, y=2)
6. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:GJS{F
f = open('C:\\test.txt', wb)
f.write('I love FishC.com!\n')
f.close()
答:注意 open() 第二個引數是字串,應該 f = open('C:\\test.txt', 'wb') 。wb不加雙引號 Python 還以為是變數名呢,往上一找,艾瑪沒找著……引發 NameError 異常。由於開啟檔案失敗,接著下邊一連串與 f 相關的均會報同樣異常。Y
7. 請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱:z?L x
def my_fun1():
x = 5
def my_fun2():
x *= x
return x
return my_fun2()
my_fun1()
答:閉包的知識大家還記得不? Python 認為在內部函式的 x 是區域性變數的時候,外部函式的 x 就被遮蔽了起來,所以執行 x *= x 的時候,在右邊根本就找不到區域性變數 x 的值,因此報錯。5%e1xW,u+
9`oFwVhEBi}O_b~!TWe$P
在 Python3 之前沒有直接的解決方案,只能間接地通過容器型別來存放,因為容器型別不是放在棧裡,所以不會被“遮蔽”掉。容器型別這個詞兒大家是不是似曾相識?我們之前介紹的字串、列表、元祖,這些啥都可以往裡的扔的就是容器型別啦。u,gS>^
s^;CB1W#0x kw?c)&8d(j<_3
於是乎我們可以把程式碼改造為:來自:bbs.fishc.com
def my_fun1():
x = [5]
def my_fun2():
x[0] *= x[0]
return x[0]
return my_fun2()
my_fun1()
但是到了 Python3 的世界裡,又有了不少的改進,如果我們希望在內部函式裡可以修改外部函式裡的區域性變數的值,那麼也有一個關鍵字可以使用,就是 nonlocal:uC{L$J)1%E
def my_fun1():
x = 5
def my_fun2():
nonlocal x
x *= x
return x
return my_fun2()
my_fun1()