摘要:
程式錯誤是不可恢復的;當程式遇到錯誤時,它會立即退出或崩潰。
優秀的程式設計師會確保他們的程式碼或軟體能夠優雅地處理軟體使用過程中可能出現的錯誤/異常,而不會崩潰或產生不良結果。想像一下,為金融機構編寫僅接受數字輸入的軟體,如果用戶輸入了字母而不是數字進行算術運算,這通常會引發錯誤,並且軟體會因為一個用戶而崩潰,如果沒有任何適當的機制來處理錯誤的話。這絕對不是一件好事——它對業務不利,可能導致客戶感到沮喪,而且有人可能會因為不稱職而失去工作。
在本文中,我們將學習如何以最佳方式處理程式碼中由於使用者互動而可能出現的錯誤。敬請關注。
本文適合:
通讀本文後,讀者應該能夠:
錯誤和異常通常可以互換使用,但它們在技術上意義不同。在Python 中,錯誤和異常都是BaseException都是
SyntaxError
<code class="language-python">name = “Austin”; print(name)</code>:
SyntaxError
這是程式設計師面臨的最常見錯誤類型之一,它發生在程式碼不遵循正確的 Python 語法時,並且可以在解析期間檢測到。對於學習者或從其他程式語言轉向 Python 的人來說,這是一個很容易出現的問題。
IndentationError
這會導致 : 當 Python 程式碼縮排不正確時,就會發生此錯誤,並在解析程式碼時偵測到。 Python 中的縮排非常重要。它是 Python 中唯一可以定義程式碼區塊的方式,這與大多數使用花括號的語言不同。
<code class="language-python">name = “Austin”; print(name)</code>
這段程式碼會因為縮排不當而導致錯誤。它應該是:
<code class="language-python">active = True if (active): print(“The user is active”)</code>
Python 中的異常在運作時發生。與錯誤不同,可以以程式設計方式正確地處理或捕獲它們,以便我們的程式可以繼續運行而不會崩潰。換句話說,它們是可恢復的。以下是 Python 中一些常見的異常:
這些類型的異常是 Python 程式語言的一部分。以下列出其中一些:
ValueError
:當向函數傳遞無效參數時發生此錯誤,即使類型可能正確。
<code class="language-python">if (active): print(“The user is active”)</code>
從上面的程式碼片段中,如果我們向函數傳遞數字字串,它將成功轉換為數字,否則,它將產生 ValueError
。
<code class="language-python">def str_num(num_string): return(int(string))</code>
TypeError
:當向函數傳遞不合適的型別參數時,就會引發此錯誤。
<code class="language-python">print(str_num(“123”)) #works perfectly print(str_num(“abc”)) #raises a ValueError</code>
這會引發 TypeError
。
IndexError
:當您嘗試使用錯誤索引存取清單中的值時,就會出現此錯誤。
<code class="language-python">def addition(num1, num2): return num1 + num2 # calling the function addition(5, A)</code>
這會導致 IndexError
,因為 my_list[2]
無法存取。
KeyError
:當嘗試使用錯誤或不存在的鍵存取字典中的值時,就會引發此錯誤。
<code class="language-python">my_list = [“dog”, “cat”] my_list[2]</code>
這會引發 KeyError
。
您可以在此處找到其他內建異常。
自訂異常由程式設計師定義。在這裡,Python 使程式設計師能夠手動定義程式應該在執行期間檢查的條件,並在找到時引發異常。您可以透過建立一個從 Exception
類別繼承的類別來實現這一點。
處理異常可確保我們的軟體應用程式在遇到應用程式生命週期中出現的某些錯誤時具有可預測的效能。在本節中,您將學習如何在程式設計中實現這一點。
try-except
語句try-except
語句提供了一種安全的方法來處理可能引發錯誤或異常的程式碼。 try
語句包裝有問題的程式碼或try
子句;這是很可能導致整個程式出錯的程式碼部分;當從使用者接收輸入、從檔案讀取時,這很可能會發生,僅舉幾例。
except
語句標示 except
子句的開始;這是包裝在 except
區塊中的其餘程式碼。 except
子句處理 try
區塊中引發的異常。
讓我帶您了解執行工作流程。您的Python 程式通常會執行,直到它到達包含「有問題的」程式碼的try
區塊,如果當時在try
區塊中執行程式碼時沒有可能的錯誤,它會跳過except
區塊並繼續執行程式碼庫的其餘部分。但是,如果在 try
區塊中執行程式碼時遇到錯誤,則會在建立異常物件後,控制會立即跳到 except
區塊,在該區塊中,它應該由匹配的異常類別處理。
<code class="language-python">name = “Austin”; print(name)</code>
從上面的程式碼片段中,如果將非數值傳遞給程序,則會建立異常物件並引發 ValueError
。控制立即跳到 except
區塊,在該區塊中它會掃描適當的異常類別。在這裡,ValueError
類別就足夠了。錯誤已正確處理。但是,如果找不到正確的類,則控制會移動到外部 try
區塊(如果有的話),如果仍然沒有正確處理異常,則程式會崩潰。
except
語句處理多個異常類別可以檢查多個異常類別並處理特定異常。如果您不確定幾個異常中的哪一個會導致程式碼執行結果,則首選這種方法。請參閱下面的程式碼片段。
<code class="language-python">active = True if (active): print(“The user is active”)</code>
Exception
類別是 BaseException
的直接子類別。 Exception
類別是所有非致命異常的基底類別。
大多數情況下,Exception
類別足以處理程式碼執行期間引發的多數異常。
<code class="language-python">if (active): print(“The user is active”)</code>
即使 Exception
類別能夠處理非致命異常,最好還是謹慎使用它。使用正確的 Exception
類,因為它更有利於調試和提高程式碼的可讀性。
finally
語句包裝在 finally
區塊中的程式碼部分無論是否發生異常都會執行。這使得它適合處理清理任務;關閉檔案和釋放記憶體資源。
<code class="language-python">def str_num(num_string): return(int(string))</code>
建立自訂異常使程式設計師能夠為軟體程式提出特定的異常。這可能包含可能對特定軟體程式的功能有害的特殊條件或極端情況。定義的自訂異常類別必須從 Exception
類別繼承。
<code class="language-python">print(str_num(“123”)) #works perfectly print(str_num(“abc”)) #raises a ValueError</code>
上面的程式碼片段顯示如何建立和使用自訂異常。根據用例,它可以以更複雜的方式使用。
為什麼錯誤/異常處理很重要
「不要相信使用者」是軟體開發人員常見的說法,這重申了您無法完全確定使用者將如何與您的軟體應用程式互動;他們輸入的輸入類型以及您作為程式設計師在編寫應用程式時可能沒有想到的其他一些極端情況。以下解釋了正確處理錯誤/異常的一些重要原因:
使用異常處理:
try: print(10 / 0) except ZeroDivisionError: print("不能除以零!")
print(divide(10, 2)) # 輸出:5.0 print(divide(10, 0)) # 輸出:不允許除以零!
鼓勵寫簡潔的程式碼
透過將正常邏輯與錯誤處理邏輯分開,異常處理使您的程式碼更易於閱讀、調試和維護。
促進除錯
借助詳細的錯誤訊息和異常日誌,開發人員可以快速識別和修復程式碼中的問題。
例:
try: result = 10 / 0 except Exception as e: logging.error("發生錯誤", exc_info=True)
結論
在程式設計術語中,錯誤和異常大多時候可以互換使用。 Python 中錯誤和異常之間的關鍵區別在於它們如何影響我們的軟體程式。語法錯誤和縮排錯誤等錯誤會在解釋器解析程式時使程式崩潰。另一方面,如果未正確處理異常,異常會在執行時使程式崩潰。自訂異常透過使程式設計師能夠定義特定於特定軟體應用程式的異常類別來擴展錯誤處理功能。
錯誤處理對於除錯也非常重要。它可以使我們看到應用程式中發生錯誤的原因,從而為軟體維護人員提供足夠的資訊來解決問題。請務必確保在程式碼中適當地引入異常處理,以確保軟體應用程式的健全性。
感謝您的閱讀。
以上是Python 中的錯誤處理:最佳實踐。探索如何有效處理異常的詳細內容。更多資訊請關注PHP中文網其他相關文章!