一、異常
異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。 一般情況下,在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()。