Python基礎(15):python中的異常處理機制
異常:程式執行過程中由外部問題(硬體錯誤,輸入錯誤)引起的異常事件。
捕獲異常
語法:
try: <語句> except <名字>:#異常1名字 <語句> #發生異常後執行的語句 else: <語句> #沒有發生異常時執行的語句 finally: <語句> #無論是否發生異常,結束時執行的語句
try的工作原理是,當開始一個try語句後,python就在當前程式的上下文中作標記,這樣當異常出現時就可以回到這裡,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
如果在try後的語句裡發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程式的最上層(這樣將結束程式,並列印預設的出錯資訊)。
如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
示例:
開啟一個不存在的檔案,會報fileNotFoundError
用try語句捕獲這個異常,
else語句是在沒有異常的情況下執行的
拓展:
FileNotFoundError本質是一個異常類。
所有的異常,本質都是一個類。
異常類的樹形表如下:
解讀一下就是,FileNotFoundError的父類是OSError,OSError的父類是Exception類(大多數異常類的父類都是Exception),而終極boss是BaseException類(再往上就是Object類了)
明白這一點的意義有兩個:
第一:當你想捕獲一個異常,又不確定會遇到什麼異常的時候,可以直接except Exception,因為按照類的繼承原則,這條語句可以接收所有以它為父類的異常。
第二:你可以自己寫一個異常類了。
定製異常瞭解一下~
定義一個類,繼承Exception,它就成了異常類。
呼叫過程給了一個簡單的示範,當檔案不存在時,丟擲TestException異常,然後在下面捕獲,進行相應操作就可以。
丟擲異常
在進行上述操作後,有的同學會發現一個哲學性的問題:異常,從哪裡來的?
比如,FileNotFoundError,是在開啟檔案時,如果找不到,就會出現的異常。
那麼我們去看一下open方法的原始碼:
謎底揭曉:是方法在定義的時候,將可能出現的異常,丟擲了。
所以我們才能在用這個函式時,捕獲他丟擲的異常。
那麼接下來學習,如何丟擲異常。
關鍵字:raise
def test1(n): #定義函式test1
n=int(n)
if n==0:
raise ValueError('invalid value %s'%n) #丟擲一個valueerror異常
return 10/n
def test2():
try:
test1(0) #執行test1函式
except Exception as e : #捕獲異常
print(e) #列印記錄
raise #將異常丟擲,可以定義其他函式處理異常,此處不做處理