python學習筆記(八):異常處理

1、異常處理函數

在程序運行過程當中,總會遇到各類各樣的錯誤。程序一出錯就中止運行了,那咱們不能讓程序中止運行吧,這時候就須要捕捉異常了,經過捕捉到的異常,咱們再去作對應的處理。測試

下面咱們先寫一個函數,實現除法運算。spa

def calc(a,b):
 
    return a/b
 
print(calc(5,1))#調用,沒有錯誤,結果是5.0
 
>>> 5.0
 
print(calc(5,0))#再次調用,這時候就不對了,由於被除數不能爲0,下面報了一堆錯,程序中止運行了
 
>>> ZeroDivisionError: division by zero

這個時候咱們就須要捕捉異常了,若是除數是0的話,就提示用戶傳入的參數不對,從新傳入。code

捕捉異常使用try....except....關鍵字,就是你在寫代碼的時候,先要考慮到這段代碼可能會出現什麼樣的錯誤,而後作對應的處理,try裏面就是包含你作處理的代碼,except裏面就是出了某種錯誤的時候,我怎麼去處理,下面咱們改下代碼,捕捉異常。對象

def calc(a,b):
 
   try:
 
       res = a/b
 
   except ZeroDivisionError as e:#若是是除數爲0的錯誤,就返回除數不能爲0,這個as e表明把返回錯誤的信息賦給e
 
       return '除數不能爲0!'
 
   return res#這個是若是沒有這個異常的話,就返回結果
 
print(calc(5,0))#這樣再調用就不會出來錯誤了,就返回除數不能爲0這個了。
 

上面就是捕捉異常,固然上面的只能捕捉到除數爲0的錯誤,若是有別的錯誤就捕捉不到了;還有一個finally的用法,就是無論出不出異常都執行;try還有一個能夠捕捉全部異常,還有else的用法,就是沒出異常的時候怎麼辦,下面用代碼來解釋。blog

def calc(a, b):
    try:  # 捕捉異常
        res = a / b
    except ZeroDivisionError as e:
        return '除數不能爲0!'
    except KeyError as e:  # 捕捉KeyError這個異常,固然這段代碼沒用到字典,因此不會有keyerror這個錯誤,我只是舉個例子
        return 'keyerror錯誤'
    except Exception as e:  # 這個是捕捉全部的異常,無論你有什麼異常均可以捕捉到
        print('其餘異常')
        return e  #返回錯誤信息
    else:  #這個else和上面的try對應的,也就是不出異常的話走這裏
        print('沒有出異常')
        return res
    finally:  #這個finally是無論這個段代碼有沒有出異常都走它
        print('出沒出異常都走我這裏')
 
print(calc(5, 0))  #出除數異常了,會返回除數不能爲0!和執行finally裏面的代碼
 
print(calc(5, 1))  #這個沒有出異常,就會走else裏面的東西,返回結果,也會執行執行finally裏面的代碼
 
print(calc(5, 's'))  #這個也走異常了,除數是字符串,確定不能除,就走那個捕捉全部異常的代碼了,也會執行執行finally裏面的代碼

2、常見的一些異常信息:索引

 
AttributeError: 試圖訪問一個對象沒有的屬性,好比foo.x,可是foo沒有屬性x
 
IOError:輸入/輸出異常,通常是沒法打開文件
 
ImportError: 沒法導入模塊或包,通常是路徑問題或名稱錯誤
 
IndentationError:代碼沒有正確對齊,屬於語法錯誤
 
IndexError:下標索引超出序列邊界,好比x只有三個元素,卻試圖訪問x[3]
 
KeyError:試圖訪問字典裏不存在的鍵
 
KeyboardInterrupt:Ctrl+C被按下
 
NameError:使用一個還未被賦予對象的變量
 
SyntaxError: 語法錯誤
 
TypeError: 傳入對象類型與要求的不符
 
UnboundLocalError:試圖訪問一個還未被設置的局部變量,通常是因爲在代碼塊外部還有另外一個同名變量
 
ValueError: 傳入一個調用者不指望的值,即便值的類型是正確的

3、主動拋出異常字符串

主動拋出異常,就是咱們在代碼裏面讓它自動拋出一個異常,而後捕捉到,好比說咱們在寫自動化測試腳本的時候,結果和預期不符合,就能夠主動拋出一個異常信息,而後捕捉到,作其餘的處理,主動拋出異常使用raise關鍵字。自動化

try:
 
    raise KeyError#主動拋出一個keyerror的異常
 
except KeyError as e:
 
    print('這個是我主動拋出的異常')
 
相關文章
相關標籤/搜索