1. 程式人生 > 實用技巧 >Python之異常處理

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,因為可以報錯異常,但是也不知道報的是什麼異常,再次排查問題時,會很浪費時間