python 語法錯誤

2021-06-26 09:40:45 字數 3288 閱讀 2497

語法錯誤,也被稱為解析錯誤,也許是你得到的最普通型別的抱怨當你仍然在學習python的時候:

解析器重複錯誤行,並在本行最先檢測到錯誤的地方顯示乙個小箭頭。錯誤是由箭頭前面的標記引起的。示例中錯誤在函式print()處被檢測出來,因為它前面少了乙個冒號。檔名稱和行號被列印出來,所以你知道應該去輸入指令碼的哪個地方尋找情況。

即使乙個語句或表示式在語法上是正確的,在嘗試執行它時也可能引發乙個錯誤。在執行期被檢測到的錯誤稱為異常,並不是無條件致命的,稍後你會學習如何在python程式中處理它們。許多異常沒有被程式處理,然而,會導致下面的錯誤訊息:

錯誤訊息的最後一行指示發生了什麼。異常有不同的型別,型別作為訊息的一部分被列印出來,示例中的型別是 除零錯誤,名稱錯誤和型別錯誤。作為異常型別被列印的字串是發生的內建異常的名字。對於所有的內建異常這都是真的,但是對於使用者定義的異常不一定是真的。標準的異常名稱是內建的識別符號(不是保留關鍵字)。

本行其餘的內容提供了基於異常的型別和是什麼引發它的詳細資訊。

錯誤訊息的前面部分顯示了異常發生位置的上下文,以堆疊跟蹤的形式。一般情況下,它包含列出原始檔行的堆疊跟蹤,它將不顯示從標準輸入讀到的行。

可以寫程式來處理選定的異常。看下面的示例,要求使用者輸,直到乙個合法的整數被鍵入,但是允許使用者中斷程式,乙個使用者產生的中斷被用訊號傳送通過引發乙個異常:

try語句按如下方式工作

乙個try語句或許有多個except從句,來為不同的異常指定處理程式。至多乙個處理程式將被執行。處理程式只處理發生在相應try從句中的異常,而不處理發生在同乙個try語句的其它處理程式中的異常。乙個except從句可以命名多個異常,使用乙個括號元組,例如:

最後乙個except從句或許可以忽略異常的名字,作為萬用字元。這樣使用應該極其謹慎,因為這樣容易掩飾掉乙個真正的程式設計錯誤。它也可以被用來列印乙個錯誤資訊,然後重新引發這個異常(也允許呼叫者來處理這個異常):

try...except語句有乙個可選的else從句,如果有的話必須跟在所有的except從句後面。對於那些異常沒有發生時必須執行的**非常有用。例如:

else從句的使用比往try從句裡新增額外的**要好,因為它避免了意外的捕獲乙個異常,並不是被try...except語句保護的**所引起的。

當乙個異常發生時,它或許有乙個關聯的值,也被稱為異常的引數。這個引數的出現和型別取決與異常的型別。

except從句可以在異常名稱後面指定乙個變數。這個變數繫結到乙個異常例項,並且引數被儲存在instance.args裡。為了方便,異常例項定義了__str__()函式,所以引數可以被直接的列印出來而不用引用.args。你可以在引發前首先例項化乙個異常,並且新增任何渴望的屬性:

如果乙個異常有引數,對於未處理的異常,它們作為資訊的最後部分被列印出來。

異常處理程式並不僅僅處理那些在try從句中直接發生的異常,同樣也處理那些在try從句中呼叫(或間接呼叫)的函式裡面發生的異常。例如:

raise語句允許程式設計師迫使乙個指定的異常發生。例如:

raise的惟一引數指示被引發的異常。它要麼是乙個異常例項或是乙個異常類。

如果你需要決定乙個異常是否被引發,但是不打算處理它,乙個更簡單的raise語句形式允許你再次引發異常:

通過建立乙個新的異常類,程式可以命名它們自己的異常。異常應該典型的繼承於exception類,要麼直接的或間接地。例如:

在這個示例裡面,exception的預設的__init__()已經被重寫。新的行為簡單的建立乙個value屬性。這替換了建立args屬性的預設行為。

異常類可以被定義做任何其它類可以做的事情,但是通常保持簡單,通常只提供一些屬性,允許有關錯誤的資訊被異常的處理程式抽取到。當建立乙個能引發幾個不同錯誤的模組時,乙個通用的實踐是為那個模組裡定義的所有異常建立乙個基類,對於不同的錯誤情況,建立特定的異常子類:

許多異常被定義為以error結尾的名稱,與標準異常的命名相似。

許多標準的模組定義它們自己的異常來報告可能發生在它們定義的函式裡面的錯誤。

try語句有乙個可選的從句,它的目的是定義在任何情況下都必須被執行的清除動作。例如:

乙個finally從句在離開try語句之前總是被執行,無論乙個異常發生與否。當try從句裡面發生了乙個異常,並且沒有被乙個except從句處理(或異常發生在except從句或else從句),它會在finally從句被執行後重新引發。當try語句的任何從句通過break,continue或return語句離開時,finally從句也會被執行。乙個更複雜的示例:

就像你看到的那樣,finally從句在任何情況下都會被執行。通過兩個字串相除而引發的typeerror沒有被except從句處理,所以在finally從句被執行後重新引發。

在現實世界的應用程式裡,finally從句對於釋放外部資源非常有用(像檔案和網路連線),不管對資源的使用是否成功。

一些物件定義標準的清除動作來保證當物件不再被需要,不管使用物件的操作是成功或是失敗。看下面的示例,嘗試開啟乙個檔案並把它的內容列印到螢幕:

這個**的問題是在這部分**執行完後,檔案的開啟狀態持續乙個不確定的時間。在簡單的指令碼裡面這不算是乙個問題,但對於大的應用來說是乙個問題。with語句允許像檔案這樣的物件以確保它們總是被合適的和正確的被清除的方式來使用:

在語句執行後,檔案f總是被關閉,即使在處理行時遇到了問題。像檔案這樣的,提供了預定義清除動作的物件在文件裡將指出這一點。

python語法錯誤提示 python錯誤提示

modulenotfounderror 找不到 模組 unboundlocalerror 引用 變數沒有定義 syntaxerror 語法錯誤 typeerror 型別錯誤 attributeerror 屬性錯誤,特性引用和賦值失敗時會引發屬性錯誤 eofebuteerror input 讀取到eo...

shell語法錯誤

a 0.5 b 0.4 if a gt b then echo sucess fi報錯 未預期的符號 then 附近有語法錯誤 if囧 囧 a gt b囧 then 把上面幾個 囧 換成空格就好了。a 0.5 b 0.4 if a gt b then echo sucess fi報錯 0.5 需要整...

python基礎 語法錯誤和異常

try 可能出現異常的 except 如果有異常執行的 finally 無論是否存在異常都會被執行的 注意 異常型別的順序要注意,最大的exception放在最後。err表示的是錯誤的原因。ef func try n1 int input 輸入第乙個數字 n2 int input 輸入第二個數字 s...