Python基礎總結之異常、調試程式碼第十二天開始(新手可相互督促)
- 2019 年 10 月 3 日
- 筆記
年薪20萬的夢想,加油!
我們在寫程式碼的時候,控制台經常會報錯,因為某種錯誤,導致我們的程式停止,且不再運行下面的程式碼。
我們看一個錯誤的程式碼示例:
def add_1(): #沒有參數
print('我出錯了') #不會被執行
def add_2(): #函數二調用函數一
print('第二個函數調用函數一,並給他一個參數')
add_1(4) #函數一沒有參數,所以有會報異常,並終止,不會執行函數一裡面的程式碼
def add_3(): #函數三調用函數二
add_2()
d = add_3() #調用函數三
看完截圖,可以理解在函數調用的路徑中,控制台顯示的調用過程很清晰,這個過程就是函數調用棧的概念,它可以直接找到出錯的地方。因為定義的函數add_1,不需要任何參數。
但是在調用的時候傳入了一個參數值4,所以導致了程式停止,函數add_1裡面的print語句沒有被執行。
當我們在控制台看到Traceback出現,就說明程式有異常出現,異常就是最下面的TypeError。它只是異常的一種,如果我們沒有對異常進行捕獲處理,程式就會停止,且後面的程式碼都不會再執行。
我們可以使用 try…except…finally… 這樣的方法來捕獲異常,和處理異常。
1 def add_1(): #不需要傳入參數 2 print('我出錯了') #不會被執行 3 4 def add_2(): #函數二調用函數以 5 print('第二個函數調用函數一,並給他一個參數') 6 try: 7 add_1(4) #我們知道在這裡,傳參的時候會導致錯誤,所以我們在這裡捕獲異常。 8 except : #except 後面不添加任何錯誤類型,表示捕獲所以異常類型。再不知道是什麼類型的異常,導致程式停止,可以用它來處理。 9 print('捕獲了所有異常,不論什麼異常導致') 10 11 def add_3(): 12 add_2() 13 d = add_3() #調用函數三
當我們不知道哪裡異常的時候,我們可以將try…except…的範圍先放大,然後慢慢縮小。
1 try: 2 a = ['a','b',1,2] #創建一個列表,變數是a,指向列表 3 4 print(c) #列印出錯變數c,會出現一個未聲明對象的錯誤:NameError,程式碼中的變數c並沒有指向任何對象 5 except TypeError: #TypeError是類型異常的錯誤,我們捕獲的異常和程式出現的異常不一致,所以捕獲是不成功的 6 print('捕獲異常')
從圖中發現我們捕獲的異常和出現的異常不一致,所以異常的捕獲是失效的,python 中有很多異常類型,如果不指定用哪個類型的異常捕獲,那麼就直接用案例一的方法,捕獲所有異常,我們可以這樣實現程式碼:
except Exception: 也可以直接寫成 except: 不加後面的Exception,也代表捕獲所有的異常,兩種格式。
1 try: 2 a = ['a','b',1,2] #創建一個列表 3 4 print(c) #列印出錯變數c,會出現一個未聲明對象的錯誤:NameError,因為列表的變數是a 5 except Exception: #Exception,代表捕獲所有類型的異常 6 print('捕獲所有類型的異常')
如果我們程式運行到這裡的時候,我們知道一般會出現哪幾種情況,我們可以連續使用幾個except程式碼塊兒,分別捕獲不同的異常。當執異常產生了,並且出現的異常類型是我們捕獲的except程式碼塊兒中的一個類型,那麼所捕獲的錯誤類型就會執行相應的程式碼,而不是對應的該異常的程式碼塊,因為捕獲的異常類型不匹配,所以它們對應的程式碼不會被執行。
1 try: 2 a = ['a','b',1,2] #創建一個列表 3 4 print(c) #列印出錯變數c,會出現一個未聲明對象的異常報錯:NameError,因為列表的變數是a 5 6 except TypeError: 7 print('捕獲 TypeError 類型異常') 8 except NameError: #捕獲NameError類型異常 9 print('捕獲 NameError 類型異常')
我們知道了程式碼停止運行的異常類型,我們才能根據異常的類型去修改調試我們的程式碼。接下來我們再看看finally語句。finally語句,不管是否有異常,我們都有執行一段程式碼,比如,即使讀取文件出現異常,那麼我們也要執行後面的程式碼,那麼我們就可以用finally這個關鍵字實現。
1 import os #導入os模組 2 try: 3 os.chdir(r'C:Program Filestools') #切換到指定的路徑目錄 4 print(os.listdir(os.getcwd())) 5 6 file_1= open(r'C:Program Filestoolsffff.txt') #我們的目錄中沒有ffff.txt文件 7 8 except FileNotFoundError: #捕獲未找到文件的異常報錯 9 print('未找到文件 FileNotFoundError') 10 11 finally: #但是下面的程式碼我們還是想執行 12 print('為了證明執行力finally的程式碼')
捕獲異常的初級使用方法大概就是這樣捕獲了。下面附上常見的異常類型, 多多敲擊程式碼,出錯後要嘗試根據錯誤的提示,去修改程式碼,這也是一種成長~~~~~
1.AssertionError:當assert斷言條件為假的時候拋出的異常
2.AttributeError:當訪問的對象屬性不存在的時候拋出的異常
3.IndexError:超出對象索引的範圍時拋出的異常
4.KeyError:在字典中查找一個不存在的key拋出的異常
5.NameError:訪問一個不存在的變數時拋出的異常
6.OSError:作業系統產生的異常
7.SyntaxError:語法錯誤時會拋出此異常
8.TypeError:類型錯誤,通常是不通類型之間的操作會出現此異常
9.ZeroDivisionError:進行數學運算時除數為0時會出現此異常