關於try,finally的使用,以及對Python錯誤的一些理解。
學過一些時間的Pythoner都知道。Python的錯誤是一個類,一般的錯誤都繼承與Exception。
一般在專案中,可能會定義一些自定義的類,在一些函式中,通過raise的方式,將該錯誤進行啟用,呼叫該函式者可以通過try與except指定錯誤型別的方式來捕獲該錯誤。
今天在寫一個函式中需要用到try來抵擋一下異常,對於Python的報錯,看來也可以一起好好的學習下。
在常規的認知中,錯誤只能通過except來處理錯誤,其實finally同樣也可以
還有就是在報錯中,一般會存在存在多個報錯,就是下面這兩條語句
During handling of the above exception, another exception occurred:
簡單翻譯:正在處理上面的錯誤時,另外一個整個發生
The above exception was the direct cause of the following exception:
上面的錯誤是導致以下異常的原因
當看到第一條的時候,我測試發現,一般發生在處理語句,except或finally中,本來except或者finally就是處理異常的,但在處理中自己發生了錯誤
def t_try(): try: print(123) raise KeyError except Exception as e: raise ValueError # raise Exception() from e finally: ... # error()
上面的程式碼就將演示出During handling of the above exception, another exception occurred:的情況
Traceback (most recent call last): File "/t_try.py", line 12, in t_try raise KeyError KeyError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/t_try.py", line 23, in <module> r = t_try() File "t_try.py", line 14, in t_try raise ValueError ValueError
本來except是處理try中的錯誤,但自身錯誤的。
def t_try(): try: print(123) raise KeyError except Exception as e: raise ValueError from e # raise Exception() from e finally: ... # error()
當改成這種形式之後,報錯的中間語句會變成The above exception was the direct cause of the following exception:
因為我用了raise from的形式。
其實可以通過觀察是否出現這兩個語句來判斷,錯誤是直接發生上浮,還是在處理的過程中發生,對與報錯的分析還是有很大的幫助的。
對於錯誤的理解,我個人認為他就是阻止某執行緒執行的殺手。當一個錯誤發生時,它不需要任何的return,就可以通過函式或者模組呼叫的棧區返回,層層上浮,直到停止該執行緒的執行,並將其通過stderr的通道輸出。
有了這個理解,就可以嘗試通過finally去處理error
def t_try(): try: print(123) raise KeyError # except Exception as e: # raise ValueError from e # raise Exception() from e finally: # ... return None
函式預設的如果沒有返回,就因為返回None,這個很多人都知道,上面,我寫了finally,但卻寫了 return None,這樣就可以將try中的error處理掉,一般的情況下,當一個函式或者模組中,發生了error,會立即截斷後續的執行,按照我前面的理解,將自身上浮。但加了finally就不一樣了,error必須等待finally的執行完畢以後,才能將自己上浮。在finally中,手工寫了return ,這就好比關門打狗了。error還沒上浮,finally直接關閉了函式的棧。但加入finally中沒有做return,finally中的相關命令執行完畢以後,error還是會通過該函式進行上浮。
對於Python的報錯一直沒有好好的研究過,是能力的問題也可能是自己平時大意了。
學習彙編確實讓我對計算機的執行有了更多自己的思考。