python的異常處理

      在全部的程序中,都會遇到異常,有些異常是代碼編寫的時候產生的,在前期過程當中可能會直接致使程序沒法運行。這一類的異常,在編寫代碼的時候,程序能夠直接排查修改。但有些異常,是在程序運行過程當中產生的,多是與用戶交互獲取的數據沒法識別,也或者是網絡請求失敗致使程序沒法繼續等等緣由。爲了防止程序崩潰,這一類的錯誤,就須要程序員在編寫的時候提早考慮到並進行相應的異常處理。每一門語言基本都有本身相應的異常防護機制,python尤爲如此,不只給了錯誤調試語句,還提供了龐大的內置異常類,讓咱們能夠精準的針對不一樣異常給出不一樣的處理方式。關於python中具體的異常分類信息,能夠參照官方文檔,地址以下:(在官方文檔中,內置異常還包括了警告和異常層次,建議一塊兒看一下)html

中文地址:http://python.usyiyi.cn/translate/python_352/library/exceptions.html#concrete-exceptionspython

英文地址:https://docs.python.org/3/library/exceptions.html#concrete-exceptions程序員

     在知道了具體的異常分類後,須要討論的是預測有異常發生的時候,應該如何處理,python的異常防護相對十分簡單,經常使用只有三條語句,而且在調試的時候無需所有使用。先看一個簡單的調試語句:數組

try:
    print(name) #打印變量name的值
except Exception:#若是有異常則輸出告警 EXception能夠捕獲python中任意異常,它屬於異常基類
    print("Error !")
"""輸出結果以下
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/異常處理.py
Error !
Process finished with exit code 0 """

 代碼如上所示,是一個簡單異常處理,代碼模塊爲try-except。try的代碼內容爲業務模塊,except 後接須要捕獲的異常類型,上面的代碼爲了演示,直接使用了基類,在實際運用中咱們經常須要捕獲具體異常類,而後給出特定的處理方式,具體爲在下一份代碼中說明。except下屬的代碼爲捕獲異常後的處理模塊。在簡單演示了一個異常處理後,下面看一份稍微複雜的異常處理,同時會提到關於異常處理的另外兩條語句網絡

namlist = ['test1','test2']#定義一個數組,長度爲2
try:
    print (namlist[3])#在try的代碼塊嘗試打印namlist[3] 很明顯下標越界
except NameError as error:#嘗試捕獲NameError,並將其打印信息賦給error
#NameError的具體定義參見官方文檔。下同 print("NameError:",error)#在except的代碼塊 打印捕獲的異常信息 except IndexError as error:#在嘗試捕獲上一個異常以後,直接嘗試捕獲另外一個異常。 print ("IndexError:",error) except Exception as error:#再次嘗試 print ("Exception:",error) else:#else語句,此處的用法是接在exception後面。若是咱們預測的異常一個都未捕獲到,則執行該語句的代碼模塊
#在本段代碼中,這個語句是不可能執行的,由於嘗試捕獲了Exception異常類。僅僅是說明使用方法 print("若是你一個也沒抓到,那我歸你好啦") finally:#finally語句,接在異常防護的最後,能夠跳過else直接使用。無論有沒有捕獲異常,他的下屬代碼段都會執行 print("無論你抓沒抓到,我都在喔") """輸出結果以下 /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/異常處理.py IndexError: list index out of range 無論你抓沒抓到,我都在喔 Process finished with exit code 0

  從上面的輸出信息能夠看到,咱們捕獲到了一個IndexError,而且程序最終執行了finally的代碼模塊。以上基本就是python的常規異常處理了。除了不可控的異常出現以外,有些代碼須要特定的運行條件,那麼,咱們能夠認爲拋出異常。python中拋異常的方式有兩種,斷言,或者raise語句。其中,斷言須要斷定條件,而raise是直接後接須要拋出的異常類型。兩者應用場合在個人理解中略有分別,斷言經常使用於根據條件成立來決定拋異常的與否。例如,一個變量初始值爲空,在程序運行到一半它從網絡獲取數據,若是沒有數據,那麼,程序沒法執行。就可使用斷言來斷定變量是否爲空,若是爲空,則直接拋異常,並給出告警。固然,raise能夠實現一樣功能,不過它須要一個if判別。所以,在代碼使用上來說,斷言更爲簡潔,而且它也能被exception捕獲。咱們首先來看下斷言機制:測試

num1 = 1 #定義倆變量
num2 = 1
"""斷言關鍵字使用,後接斷定條件,若是條件成立,則無異常。不成立,拋異常。
用","分割,後接給出的告警信息。告警信息也能夠省略""" assert num1 + num2 == 3, "腦子是個好東西,我但願你有一個。好好計算!" print("對啦") """輸出結果 /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/異常處理.py Traceback (most recent call last): File "/Users/penglong/Documents/python/s10/day4/異常處理.py", line 20, in <module> assert num1 + num2 == 3, "腦子是個好東西,我但願你有一個。好好計算!" AssertionError: 腦子是個好東西,我但願你有一個。好好計算! Process finished with exit code 1"""
#####斷言異常捕獲測試######## num1 = 1 num2 = 1 try: assert num1 + num2 == 3, "腦子是個好東西,我但願你有一個。好好計算!" except AssertionError as error: print(error) """輸出結果 /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/異常處理.py 腦子是個好東西,我但願你有一個。好好計算! Process finished with exit code 0""" #能夠看到打印信息爲咱們定義的告警信息

  如上,代碼給的條件是明顯不成立的,因此程序輸出了異常。使用上來說,斷言的語句用於已知的條件調試相對簡潔。上面的代碼異常屬於計算錯誤,而且告警信息屬於自定義。但有些異常時python定義的異常類裏面存在的,爲了方便快捷,咱們能夠直接拋出,無需定義異常信息,這時就須要raise來解決了。簡單代碼以下:調試

raise NameError("name error!")#拋出一個NameError異常,能夠給一個打印信息,也能夠不給
#常規自定義具體異常信息應該儘可能拋Exception類 這裏僅作其餘類示範。
print("然而並無錯誤!")#拋出異常後嘗試打印點神馬
"""輸出結果
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/異常處理.py
Traceback (most recent call last):
  File "/Users/penglong/Documents/python/s10/day4/異常處理.py", line 31, in <module>
    raise NameError
NameError: name error!#若是沒給參數,則沒有具體錯誤信息
Process finished with exit code 1"""  

  如上,raise能夠直接拋出python自帶的異常類,一看就知道哪裏出了錯誤,因此若是不須要條件斷定的是自定義異常信息,儘可能拋Exception類。這樣不至於混淆異常信息。以上代碼都立足於功能示範,在實際使用中,一旦拋出異常,程序就會崩潰。因此常規的拋異常大多用於代碼調試。若是是爲了預防未知信息,拋異常應該出現try--except語句的try下屬代碼模塊,而後用except捕獲,再給出相應的解決方案。code

     以上是python的常見異常處理機制,python的異常類繁多,基本能夠知足平常須要。對於異常的文章,大部分會討論到自定義異常,但我還沒有遇到須要自定義異常的狀況,每每簡單的自定義告警信息等需求都能用內置來直接更改。固然,不少測試場景確實須要更爲精確的異常信息,那麼可能須要本身從新建立一個異常類模塊,在本文暫不討論。值得一提的是,不少模塊能夠在python的開源論壇上能夠找到,若是確實須要,不妨先去找一下。htm

相關文章
相關標籤/搜索