1. 程式人生 > 其它 >關於try,finally的使用,以及對Python錯誤的一些理解。

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

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