關於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的報錯一直沒有好好的研究過,是能力的問題也可能是自己平時大意了。

 

學習匯編確實讓我對計算機的運行有了更多自己的思考。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM