Python 異常處理

一般情況下,在Python無法正常處理程式時就會發生一個異常,彈出一大串英文提示。對於一般使用者來說會無所適從,影響使用者體驗,嚴重的會導致程式崩潰。我們需要對異常捕獲進行處理。

Python 異常處理

一、異常處理的語法:

try:<語句> #要執行的程式碼except <名字1>:#捕獲異常名<語句> #對捕獲的異常進行處理except <名字2>:#如果對多個異常一併處理,用逗號分隔異常名<語句> else:<語句> #如果沒有異常發生

例如:

try: print(“-”*20) #把符號列印20遍,python特有的語法功能,方便易用吧 n1=input(“input first num:”) n2=input(“input second num:”) print(int(n1)/int(n2)) print(“-”*20)except ZeroDivisionError: print(“除數不能為0!”)except ValueError: print(“只能輸入數字!”)

執行結果:

——————————input first num:7input second num:0除數不能為0!>>> ——————————input first num:ainput second num:5只能輸入數字!

二、捕獲異常的描述資訊

Python 異常處理

把描述資訊用as 儲存到變數中,這樣就看到系統提示的英文異常了。

如下例:

try: print(“-”*20) n1=input(“input first num:”) n2=input(“input second num:”) print(int(n1)/int(n2)) print(“-”*20)except (ZeroDivisionError, ValueError) as desc: print(“捕捉到異常:%s” %desc)

結果:

——————————input first num:5input second num:0捕捉到異常:division by zero

三、捕獲所有的異常

異常會有很多,常常防不勝防。這時,我們可以不指明異常型別,讓它可以處理任何異常。

except : print(“出錯了”)也可以把具體的異常資訊打印出來。except Exception as desc: print(“捕捉到異常:%s” %desc)

四、異常後處理

發生異常後,有些事情必須要進行處理,比如變數釋放,鎖釋放,檔案關閉等等,否則系統會崩潰。這些要處理的程式碼要放在try。。。。except。。。finally語句的finally區。如下例:

finally: f。close() print(‘釋放資源’)

Python 異常處理

注意:

try。。。。except。。。else。。。finally,順序不能反,else和finally可選,else語句的存在以except存在為前提。

五、主動丟擲異常

raise顯式地觸發異常,如下例:

try: raise IndexErrorexcept IndexError: print(“索引越界”)except: print(“出錯了”)

結果:

索引越界

附:常見異常

1. NameError

訪問一個未申明的變數,會引發NameError異常。

2. ZeroDivisionError

被0除,會引發ZeroDivisionError異常。

3. SystaxError

語法錯誤,會引發SystaxError異常。

4. IndexError

訪問序列中不存在的索引時,會引發IndexError異常。

5. KeyError

訪問dictionary中不存在的鍵時,會引發KeyError異常。

6. FileNotFoundError

訪問不存在的檔案,會引發FileNotFoundError異常。

7. AttributeError

訪問不存在的物件屬性時,會引發AttributeError異常。

六、assert斷言

斷言指期望使用者滿足指定的條件,當不滿足使用者定義的約束條件時,它會觸發AssertionError異常。可以看作是條件式的raise語句。格式如下:

Assert 邏輯表示式,data #data是可選的

Python 異常處理

等同於:

If not 邏輯表示式: raise AssertionError(data)

如下例:

a=0assert a != 0,“a值不能為0!”

結果:

Traceback (most recent call last): File “D:/pyTest/test。py”, line 2, in assert a != 0,“a值不能為0!”AssertionError: a值不能為0!

七、自定義異常

先定義一個繼承Exception類的子類,再用raise呼叫這個異常類。如下例:

class ShortInputException(Exception): #定義一個異常類 def __init__(self, pw): self。pw = pwtry: text=input(“請輸入密碼:”) if len(text) < 6: raise ShortInputException(text)except ShortInputException: print(“密碼長度不能小於6位!”)except Exception as desc: print(“出錯了:%s” %desc)

執行結果:

請輸入密碼:1234密碼長度不能小於6位!

八、預定義清理

Finally可以關閉檔案,清理資源。除了finally手動釋放資源外,還可以用with語句預定義清理操作,即無論資源在使用過程中是否發生異常,都會執行清理的操作,比如檔案使用後自動關閉。

With 上下文表達式 [as 資源物件]: 物件的操作

Python 異常處理

上下文表達式:返回一個上下文管理器物件。若指定了as子句,該物件並不賦值給資源物件,而是將上下文管理器的__enter__()方法的返回值賦值給資源物件。

資源物件:可以是單個變數,也可以是元組。

物件的操作:with語句包裹的程式碼塊。在執行該程式碼塊之前,會呼叫上下文管理器的__enter__()方法;在執行該程式碼塊之後,會執行__exit__()方法。

如下例:

with open(“/tmp/abc。txt”) as file: data=file。read()

使用with語句開啟檔案,如果能開啟則將檔案物件賦值給file,然後執行with語句的程式碼塊,讀檔案。程式碼塊執行完畢後,with語句會關閉檔案。即使程式碼塊執行過程中產生了異常,with語句也會關閉檔案。