十、python異常處理
阿新 • • 發佈:2020-09-09
異常:程式出現了意想不到的情況
如果異常不解決,程式會崩潰,停止執行
捕獲異常,如果出現了異常,我們會讓他們按照事先規定的規則去執行對應的操作(記錄操作日誌)
一、語法
try (要執行的有可能發生異常的程式碼):
程式碼
except (異常):
出現異常的時候要執行的程式碼(執行的操作),記錄日誌
# 一旦try當中的程式碼報錯,會立即跳到except,下面的程式碼不會繼續執行
str_1 = ['python'] try: print(str_1 [8]) print("是否會執行?") except: print('記錄錯誤日誌') print("程式碼完成") ''' 結果: 記錄錯誤日誌 程式碼完成 '''
# 如果try裡面的程式碼沒有出現異常,就不會執行except str_1 = ['python'] try: print(str_1 [1]) print("是否會執行?") except: print('記錄錯誤日誌') print("程式碼完成") ''' 結果: y 是否會執行? 程式碼完成 '''
好的程式設計師:知道什麼程式碼需要放到try裡面
a=4 b=1 print(a*b) #需不需要加異常處理? a='a' b='b' print(a*b) #如果事先不知道傳入的是什麼型別,則需要加異常處理try: print(a*b) except: print('引數錯誤,記錄日誌')
try裡面的語句調換順序,報的錯誤就會不一樣
同一個try不可能捕獲兩個異常的,如果遇到一個異常就直接執行except語句了
二、異常捕獲的進階版
指明出現的異常型別(先不要加異常,讓他報錯,將報錯的型別記住,去異常捕獲的時候,加入except語句中)
lst=['zjx'] try: print(4/0) lst[3] except IndexError as e: print('出現異常:{}'.format(e)) except ZeroDivisionError as e:print('出現除法錯誤:{}'.format(e)) finally: #不管有沒有報錯,finally都會執行的 print('hello world')
三、raise
手動丟擲異常,讓程式報錯
def join_team(age,gender): if age > 22: raise ValueError('年齡要小於22') print('可以加入team') print(join_team(23,'girl')) ''' 結果: ValueError: 年齡要小於22 '''
四、常見的異常型別:
ImportError:無法引入模組或包
IndexError:下標索引超出序列邊界
NameError:使用一個還未賦予物件的變數
SynataxError:程式碼邏輯語法出錯,不能執行,不能去捕獲
TypeError:傳入的物件型別與要求不符
ValueError:傳入一個不被期望的值,即使型別正確
KeyError:試圖訪問你字典裡不存在的鍵
IOError:輸入輸出異常,檔案操作
1)SyntaxError:語法錯誤
try: ldljsdjlg'khkhkh' except: print('語法錯誤') #結果顯示錯誤,不能捕獲異常 ''' ldljsdjlg'khkhkh' ^ SyntaxError: invalid syntax '''
2)KeyError
dict1 = {'1':'zjx','2':'hauhau'} print(dict1['3']) ''' print(dict1['3']) KeyError: '3' '''
3)IndexError
lst1 = [1,2,3,4,5] print(lst1[5]) ''' print(lst1[5]) IndexError: list index out of range '''
五、異常分組
發現了一個嚴重級別,阻塞級別的bug(簡訊通知相關人員趕緊集合的程式碼),一個輕微級別的bug(記錄日誌的程式碼)
針對不同的組進行不同的操作
try: 1 / 0 ['hello'][3] {'name':'pyrhon'}['age'] except (IndexError,KeyError) as e: '簡訊通知這裡出現很嚴重的問題' print('可以捕獲IndexError和KeyError') except ZeroDivisionError as e: '記錄日誌' print('除法出現異常{}'.format(e))