1. 程式人生 > 其它 >Python學習筆記(6)-異常

Python學習筆記(6)-異常

異常

程式在執行過程當中,不可避免的會出現一些錯誤,比如:使用了沒有賦值過的變數、使用了不存在的索引、除0等,這些錯誤在程式中,我們稱其為異常,程式執行過程中,一旦出現異常將會導致程式立即終止,異常以後的程式碼全部都不會執行

處理異常

程式執行時出現異常,目的並不是讓我們的程式直接終止,Python是希望在出現異常時,我們可以編寫程式碼來對異常進行處理
try語句
try:
程式碼塊(可能出現錯誤的語句)
except 異常型別 as 異常名:
程式碼塊(出現錯誤以後的處理方式)
except 異常型別 as 異常名:
程式碼塊(出現錯誤以後的處理方式)
except 異常型別 as 異常名:
程式碼塊(出現錯誤以後的處理方式)
else:
程式碼塊(沒出錯時要執行的語句)
finally:
程式碼塊(該程式碼塊總會執行)
try是必須的 else語句有沒有都行
except和finally至少有一個
可以將可能出錯的程式碼放入到try語句,這樣如果程式碼沒有錯誤,則會正常執行,如果出現錯誤,則會執行expect子句中的程式碼,這樣我們就可以通過程式碼來處理異常,避免因為一個異常導致整個程式的終止

print('異常出現前')
l = []
try:
 # print(c)
 # l[10]
 # 1 + 'hello'
 print(10/0)
except NameError:
 # 如果except後不跟任何的內容,則此時它會捕獲到所有的異常
 # 如果在except後跟著一個異常的型別,那麼此時它只會捕獲該型別的異常
 print('出現 NameError 異常')
except ZeroDivisionError:
 print('出現 ZeroDivisionError 異常')
except IndexError:
 print('出現 IndexError 異常')
# Exception 是所有異常類的父類,所以如果except後跟的是Exception,他也會捕獲到所有的異常
# 可以在異常類後邊跟著一個 as xx 此時xx就是異常物件
except Exception as e :
 print('未知異常',e,type(e))
finally :
 print('無論是否出現異常,該子句都會執行')
print('異常出現後')

丟擲異常

當在函式中出現異常時,如果在函式中對異常進行了處理,則異常不會再繼續傳播,如果函式中沒有對異常進行處理,則異常會繼續向函式呼叫處傳播,如果函式呼叫處處理了異常,則不再傳播,如果沒有處理則繼續向呼叫處傳播,直到傳遞到全域性作用域(主模組)如果依然沒有處理,則程式終止,並且顯示異常資訊
當程式執行過程中出現異常以後,異常資訊會被儲存一個專門的異常物件中,異常傳播就是異常物件拋給了呼叫處,ZeroDivisionError類的物件專門用來表示除0的異常,NameError類的物件專門用來處理變數錯誤的異常等,在Python為我們提供了多個異常物件,可以使用raise語句來丟擲異常,raise語句後需要跟一個異常類或異常的例項,也可以自定義異常類,只需要建立一個類繼承Exception即可

class MyError(Exception):
 pass
def add(a,b):
 # 如果a和b中有負數,就向呼叫處丟擲異常
 if a < 0 or b < 0:
 # raise用於向外部丟擲異常,後邊可以跟一個異常類,或異常類的例項
 # raise Exception 
 # 丟擲異常的目的,告訴呼叫者這裡呼叫時出現問題,希望你自己處理一下
 # raise Exception('兩個引數中不能有負數!') 
 raise MyError('自定義的異常')
 # 也可以通過if else來代替異常的處理
 # return None
 r = a + b
 return r
print(add(-123,456))