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時會出現此異常