異常處理

1、基本概念編程

一、什麼是異常spa

  所謂程序中的異常,就是錯誤發生的信號,也就是說當程序出錯而且程序沒有處理這個錯誤,則會拋出一個異常,而且程序會隨着這個異常終止。code

二、程序中錯誤的分類:blog

(1)語法錯誤:內存

  語法錯誤,就是程序執行前必需要避免的,好比if語句後面沒有冒號、關鍵字拼寫錯誤等等,這樣的錯誤一目瞭然,很好避免。資源

(2)邏輯錯誤:io

  邏輯錯誤是程序運行過程當中發生的「不符合編程邏輯」的錯誤,具體又能夠細分爲以下幾個:class

<1>ValueError:語法

<2>NameError:程序

<3>IndexError:

<4>KeyError:

<5>AttributeError:

<6>ZeroDivisionError:

<7>TypeError:

三、異常處理的兩大分類

(1)對於能夠預知的錯誤的發生,咱們應當用if條件去判斷

(2)對於不可預知的錯誤,咱們只知道可能發生錯誤的代碼塊,此時應當利用異常處理機制try...except 去處理

四、try...except詳解:

(1)多分支狀況:

  所謂的多分支,就是說被監測的代碼拋出的異常有多種可能性,而且咱們須要針對每一種異常類型都專門定製處理的邏輯。

  如上面的代碼:當程序運行到 name 的時候,發現有NameError錯誤,因而程序自動跳到 except NameError as n:這裏,並執行這裏的代碼。注意此時僅僅是對異常的狀況進行處理,並無終結程序,這咱們能夠從程序中打印出了"HelloWorld"能夠驗證。

   咱們能夠把name註釋掉,此時程序沒有了NameError錯誤,而會發現下一個IndexError錯誤:

  而程序也並無終結,照樣打印出來了HelloWorld。

(2)萬能異常——ExcePtion

  對於多分支狀況,咱們必須得知道具體異常的類型,才能「對症下藥」的爲每種異常進行相應的處理,而當咱們不肯定會發生什麼異常的時候,能夠用萬能異常解決:

<1>

<2>

(3)try..except 與finally相結合

  咱們知道,當咱們利用try...except語句去處理異常的時候,程序會在發生異常的地方「終結代碼塊」,可是咱們考慮一種狀況:當咱們打開一個文件去處理時,在文件關閉以前發生了異常,程序跳出後咱們沒法關閉程序,這樣會形成內存資源的浪費。針對這樣的「回收資源」的應用,咱們能夠在整個異常處理的代碼塊加上finally語句,不管是否拋出異常,finally裏面的代碼一定會執行。說到這裏你們確定知道了,咱們將文件關閉的代碼寫到finally下面就行了。

try:
    f = open('whw.txt','r')
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    #不知道文件中有多少行,不斷去next()
finally:
    f.close()
    #不管是否出錯,文件必然會關閉

五、主動觸發異常  raise

  有時候咱們須要嚴格限制程序的某些特性,這時候能夠用raise主動去拋出異常,例如,當咱們利用自定義元類控制類的建立時,規定類名必須大寫,能夠這樣作:

  這樣就利用主動觸發異常實現類名的限定

六、自定義異常類型

  顧名思義,咱們須要自定義一個類來實現異常的處理:

相關文章
相關標籤/搜索