Python之異常處理
Python 異常處理
1.捕獲異常 (作用:程式執行過程中,可能會出現意想不到的異常,如果異常未被解決,程式會崩潰,停止執行)
#例如,以下例子 a='name' print(a[10]) #報錯:IndexError: string index out of range print('今天是個好天氣') #報錯後面的程式將不會執行
所以,異常處理就顯得很有必要
捕獲異常的基礎語法:
1.處理異常定義,如果出現異常,我們會讓它按照事先規定的規則去執行對應的操作,從而記錄報錯的log日
2.語法:
try(要執行有可能出現異常的程式碼):
(縮排)存放可能出現報錯的程式碼模組
except(異常):
(縮排)出現異常的時候要執行的程式碼(執行的操作),記錄日誌
一旦try裡面的程式碼報錯,會立即跳到except,try報錯程式碼的下面的剩餘語句將不會執行
try: a = 'name' print(a[10]) print('今天是個好天氣') except: print('try模組存在報錯,後續程式不能被執行') 輸出結果: try模組存在報錯,後續程式不能被執行
3.如果try模組下的程式碼沒有出現異常,則正常執行,不會執行except模組下的程式碼
try: a = 'name' print(a[2]) print('今天是個好天氣') except: print('try模組存在報錯,後續程式不能被執行') 輸出結果: m 今天是個好天氣
4.一般,在寫異常處理模組時,都要預先考慮到,可能會出現報錯的地方,然後將其放到try裡面,從而防止報錯影響程式的整體執行
#前期預判 a = 'name' print(a[2]) #a變數是一個字串,根據索引值取字串的值,所以可能存在索引值超出字串的長度的報錯 print('今天是個好天氣') #案例二 b=12 c=23 print(b*c) #b和c都是變數,如果給予b和c賦予的資料型別非int和float型別,那就會報資料型別的錯誤,所以此處就需要加 異常處理
5.使用try......except......語句捕獲了異常,但是不清楚是哪裡出現問題,是資料型別錯誤、超出範圍錯誤還是其他的錯誤等等
面對以上的問題,可以使用 except Exception as err:將錯誤型別賦值給err ,打印出來
try: a = 'name' print(a[20]) print('今天是個好天氣') except Exception as err: print('try模組存在報錯{},後續程式不能被執行'.format(err)) 輸出結果: try模組存在報錯string index out of range,後續程式不能被執行
注意:工作當中,最好用以上的方法捕獲異常,這樣就可以很直觀的看到報錯的內容,也好定位問題
6.捕獲異常的進階:指明出現的異常型別
方法:先不加異常,執行程式碼,檢視程式可能出現的報錯型別,然後將報錯的型別加入except 語句中就行
語法:
try:
(縮排)執行的程式碼模組
except 報錯型別 as err:
(縮排)print('異常{}'.format(err))
finally: ---------------->該模組屬於,不管有沒有報錯,裡面的程式碼都會被執行
(縮排) print('你好世界')
lst = ['hello'] a = 4 b = 0 try: print(a/b) print(lst[2]) except IndexError as err: print('出現了異常:{}'.format(err)) except ZeroDivisionError as err: print('出現除法異常:{}'.format(err)) finally: print('hello wold') #結果: ''' 出現除法異常:division by zero 出現除法異常:division by zero hello wold '''
7.手動丟擲異常 raise
raise手動丟擲異常,讓程式終止執行
def join_team(age,gender): if age > 22: raise ValueError('年齡要小於22') print('可以加入team') print(join_team(23,'girl')) ''' raise ValueError('年齡要小於22') ValueError: 年齡要小於22 '''
8.錯誤型別介紹(以下錯誤型別,可以接下來了解使用)
ImportError :無法引入模組或包
IndexError:下標索引超出序列邊界
NameError:使用一個還未賦予物件的變數
TypeError:傳入的物件型別與要求不符合
SyntaxError:程式碼邏輯語法錯誤,不能執行,不能捕獲
ValueError:傳入一個不被期望的值,即使型別不正確
KeyError:試圖訪問你字典裡不存在的key
IOError:輸入輸出異常,檔案操作
9.異常分組
好處:如果我們發現了一個驗證級別為阻塞級別的bug,簡訊通知開發人員馬上集合解決問題,如果不同的錯誤型別,異常處理的行為是一樣的,組合起來,就可以簡化程式碼
try: 1 / 0 ['hello'][3] {'name':'pyrhon'}['age'] except (IndexError,KeyError) as e: '簡訊通知這裡出現很嚴重的問題' print('可以捕獲IndexError和KeyError') except ZeroDivisionError as e: '記錄日誌' print('除法出現異常{}'.format(e))
最好不要直接用Exception,因為可以報錯異常,但是也不知道報的是什麼異常,再次排查問題時,會很浪費時間