Python指南 錯誤和異常

2021-08-21 22:45:52 字數 2742 閱讀 5216

子目錄

至今為止還沒有進一步的談論過錯誤資訊,不過在你已經試驗過的那些例子中,可能已經遇到過一些。python中(至少)有兩種錯誤:語法錯誤和異常( syntax errors and exceptions)。

語法錯誤,也稱作解析錯誤,可能是學習python的過程中最容易犯的:

解析器會重複出錯的行,並在行中最早發現的錯誤位置上顯示乙個小箭頭。錯誤(至少是被檢測到)就發生在箭頭指向的位置。示例中的錯誤表現在關鍵字print上,因為在它之前少了乙個冒號(:)。同時也會顯示檔名和行號,這樣你就可以知道錯誤來自哪個指令碼,什麼位置。

即使是在語法上完全正確的語句,嘗試執行它的時候,也有可能會發生錯誤。在程式執行中檢測出的錯誤稱之為異常,它通常不會導致致命的問題,你很快就會學到如何在python程式中控制它們。大多數異常不會由程式處理,而是顯示乙個錯誤資訊:

錯誤資訊的最後一行指出發生了什麼錯誤。異常也有不同的型別,異常型別做為錯誤資訊的一部分顯示出來:示例中的異常分別為零除錯誤( zerodivisionerror 

),命名錯誤(

nameerror

)和型別錯誤(

typeerror )。列印錯誤資訊時,異常的型別作為異常的內建名顯示。對於所有的內建異常都是如此,不過使用者自定義異常就不一定了(儘管這是乙個很有用的約定)。標準異常名是內建的標識(沒有保留關鍵字)。

這一行後一部分是關於該異常型別的詳細說明,這意味著它的內容依賴於異常型別。

錯誤資訊的前半部分以堆疊的形式列出異常發生的位置。通常在堆疊中列出了源**行,然而,來自標準輸入的原始碼不會顯示出來。

python庫參考手冊列出了內建異常和它們的含義。

通過程式設計可以處理指定的異常。以下的例子重複要求使用者輸入乙個值,直到使用者輸入的是乙個合法的整數為止。不過這個程式允許使用者中斷程式(使用 control-c 或者其它作業系統支援的方法)。需要注意的是使用者發出的中斷會引發乙個 keyboardinterrupt 異常。

try 語句按如下方式工作:

乙個try 語句可能包含多個 except 子句,分別指定處理不同的異常。至多只會有乙個分支被執行。異常處理程式只會處理對應的try子句中發生的異常,在同乙個try語句中,其他子句中發生的異常則不作處理。乙個except子句可以在括號中列出多個異常的名字,例如:

最後乙個except子句可以省略異常名,把它當做乙個通配項使用。一定要慎用這種方法,因為它很可能會遮蔽掉真正的程式錯誤,使人無法發現!它也可以用於列印一行錯誤資訊,然後重新丟擲異常(可以使呼叫者更好的處理異常)。

try ... except 語句可以帶有乙個 else 

子句, 該子句只能出現在所有except子句之後。當try語句沒有丟擲異常時,需要執行一些**,可以使用這個子句。例如:

使用 else 子句比在 try 子句中附加**要好,因為這樣可以避免 try ... except 意外的截獲本來不屬於它們保護的那些**丟擲的異常。

發生異常時,可能會有乙個附屬值,作為異常的引數存在。這個引數是否存在、是什麼型別,依賴於異常的型別。

在異常名(列表)之後,也可以為 except 子句指定乙個變數。這個變數繫結於乙個異常例項,它儲存在instance.args的引數中。為了方便起見,異常例項定義了__getitem__ 和 __str__ ,這樣就可以直接訪問過列印引數而不必引用.args

對於未處理的異常,如果它有乙個引數,那做就會作為錯誤資訊的最後一部分(「明細」)列印出來。

異常處理控制代碼不止可以處理直接發生在try子句中的異常,即使是其中(甚至是間接)呼叫的函式,發生了異常,也一樣可以處理。例如:

在發生了特定的異常時,程式設計師可以用 raise 語句強制丟擲異常。例如:

第乙個引數指定了所丟擲異常的名稱,第二個指定了異常的引數。

如果你決定丟擲乙個異常而不處理它,raise 語句可以讓你很簡單的重新丟擲該異常。

在程式中可以通過建立新的異常型別來命名自己的異常。異常類通常應該直接或間接的從 exception 類派生,例如:

異常類中可以定義任何其它類中可以定義的東西,但是通常為了保持簡單,只在其中加入幾個屬性資訊,以供異常處理控制代碼提取。如果乙個新建立的模組中需要丟擲幾種不同的錯誤時,乙個通常的作法是為該模組定義乙個異常基類,然後針對不同的錯誤型別派生出對應的異常子類。

與標準異常相似,大多數異常的命名都以「error」結尾。

很多標準模組中都定義了自己的異常,用以報告在他們所定義的函式中可能發生的錯誤。關於類的進一步資訊請參見第 9章,「類」。

try 語句還有另乙個可選的子句,目的在於定義在任何情況下都一定要執行的功能。例如:

不管try子句中有沒有發生異常, finally 

子句都一定會被執行。如果發生異常,在

finally

子句執行完後它會被重新丟擲。

try 子句經由 break

或 return

退出也一樣會執行

finally 子句。

在finally 子句中的**用於釋放外部資源(例如檔案或網路連線),不管這些資源是否已經成功利用。

在 try 語句中可以使用若干個 except 子句或乙個 finally 子句,但兩者不能共存。

python錯誤和異常

1 語法錯誤 syntax errors 語法錯誤,也就是解析時錯誤。當我們寫出不符合python語法 時,在解析時會報syntaxerror,並且會顯示出錯的那一行,並用小箭頭知名指明最早探測到錯誤的位置。如 while ture file line 1 while ture syntaxerro...

Python 錯誤和異常

for i in range 10 print i for i in range 10 syntaxerror invalid syntax python的語法分析器完成,檢測到錯誤所在的檔案和行號,以向上箭頭標記錯誤位置,最後顯示錯誤型別 當程式檢測到乙個錯誤,直譯器就無法繼續執行下去,丟擲異常,...

Python錯誤和異常

語法錯誤是指python編譯器在編譯時出現的錯誤,語法分析器會指出出錯的一行並在最新出現問題的位置標記乙個小箭頭及錯誤提示 while true print hello world file haha.py line 1 while true syntaxerror invalid syntax 函...