python基礎03--異常處理

一、異常

異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。 一般情況下,在Python無法正常處理程序時就會發生一個異常。 異常是Python對象,表示一個錯誤。 當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。

捕捉異常可以使用try/except語句。 try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。 如果你不想在異常發生時結束你的程序,只需在try裏捕獲它。 語法: 以下爲簡單的try....except...else的語法: 

try: <語句>        #運行別的代碼 

except <名字>: <語句>        #如果在try部份引發了'name'異常 

except <名字>,<數據>: <語句>        #如果引發了'name'異常,獲得附加的數據 

else: <語句>        #如果沒有異常發生

try的工作原理是,當開始一個try語句後,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這裏,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。 

(1)如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。 

(2)如果在try後的語句裏發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並打印缺省的出錯信息)。 

(3)如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。

1.捕獲所有異常:

try:     

   正常的操作    ...................... 

except:        //沒有寫明具體異常,就捕獲所有異常

   發生異常,執行這塊代碼    ......................   

else:    

    如果沒有異常執行這塊代碼

2.捕獲所有異常

try:     

   正常的操作   

   ...................... 

except(Exception1[, Exception2[,...ExceptionN]]]):    

          發生以上多個異常中的一個,執行這塊代碼    

           ...................... 

else:     如果沒有異常執行這塊代碼

3.帶有finally子句的異常

try:         

    print(a / b)     

except ZeroDivisionError:         

        print("Error: b should not be 0 !!")     

except Exception as e:         

       print("Unexpected Error: {}".format(e))     else:         

       print('Run into else only when everything goes well')     

finally:         

      print('Always run into finally block.')

4.raise異常

自主拋出異常一個異常,可以使用raise關鍵字,等同於C#和Java中的throw語句,其語法規則如下。 

 raise NameError("bad name!") raise關鍵字後面需要指定你拋出的異常類型,一般來說拋出的異常越詳細越好,Python在exceptions模塊內建了很多的異常類型,通過使用dir()函數來查看exceptions中的異常類型

也可以自己聲明一個新的異常:

只需要要從Exception類繼承(直接或間接)即可: 

 class SomeCustomException(Exception):     

            pass

異常拋出在try..except....else....finally子句都可以使用

5.總結:

(1)except語句不是必須的,finally語句也不是必須的,但是二者必須要有一個,否則就沒有try的意義了。 

(2)except語句可以有多個,Python會按except語句的順序依次匹配你指定的異常,如果異常已經處理就不會再進入後面的except語句。 

(3)except語句可以以元組形式同時指定多個異常。 

(4)except語句後面如果不指定異常類型,則默認捕獲所有異常,你可以通過logging或者sys模塊獲取當前異常。 

(5)如果要捕獲異常後要重複拋出,請使用raise,後面不要帶任何參數或信息。 

(6)不建議捕獲並拋出同一個異常,請考慮重構你的代碼。 

(7)不建議在不清楚邏輯的情況下捕獲所有異常,有可能你隱藏了很嚴重的問題。 

(8)儘量使用內置的異常處理語句來 替換try/except語句,比如with語句,getattr()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章