1. 程式人生 > 實用技巧 >十、python異常處理

十、python異常處理

異常:程式出現了意想不到的情況

如果異常不解決,程式會崩潰,停止執行

捕獲異常,如果出現了異常,我們會讓他們按照事先規定的規則去執行對應的操作(記錄操作日誌)

一、語法

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))