您好,登錄后才能下訂單哦!
這篇文章主要介紹Python異常處理的基本知識有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
錯誤是程序中出現的錯誤,例如語法錯誤。
它發生在編譯時。讓我們看一個例子。
if a<5 File "<interactive input>", line 1 if a < 5 ^ SyntaxError: invalid syntax
錯誤也會在運行時發生,我們將它們稱為異常。異常是在程序執行期間發生并中斷程序指令正常流程的事件。
通常,當 Python
腳本遇到它無法處理的錯誤情況時,它會引發異常。
當 Python
腳本引發異常時,它會創建一個異常對象。
通常,腳本會立即處理異常。如果它不這樣做,那么程序將終止并打印對錯誤的追溯及其下落。
>>> 1 / 0 Traceback (most recent call last): File "<string>", line 301, in run code File "<interactive input>", line 1, in <module> ZeroDivisionError: division by zero
我們使用 try-except
語句在 Python
程序中啟用異常處理。
在 try
塊中,您編寫可以引發異常的代碼。
而處理或捕獲異常的代碼,我們放在except
子句中。
以下是Python try-except-else
塊的語法。
try: 你在這里做你的操作; ...................... except ExceptionI: 如果有 ExceptionI,則執行此塊 except ExceptionII: 如果有 ExceptionII,則執行此塊 ...................... else: 如果沒有異常則執行此塊。
看一看 – 30 個 Python 教程和技巧
這是有效使用 Python try
語句的清單。
根據需求,單個 try
語句可以有多個 except
語句。在這種情況下,try
塊包含可以拋出不同類型異常的語句。
我們還可以添加一個通用的 except
子句,它可以處理所有可能的異常類型。
我們甚至可以在except
子句之后包含一個else
子句。如果 try
塊中的代碼沒有引發異常,則 else 塊中的指令將執行。
讓我們通過一個示例代碼來了解 Python try-except
的使用。
try: fob = open("test", "w") fob.write("這是我的異常處理測試文件") except IOError: print "錯誤:找不到文件或讀取數據" else: print "對文件執行寫操作成功" fob.close()
上面的代碼產生以下輸出。
>>對文件執行寫操作成功
讓我們再舉一個例子,在這個例子中我們試圖以 READ 模式打開一個文件。
我們將對其執行 WRITE 操作。執行時會拋出異常。
try: fob = open("test", "r") fob.write("這是我的測試文件,用于驗證 Python 中的異常處理") except IOError: print "錯誤:找不到文件或讀取數據" else: print "對文件執行寫操作成功"
上面的代碼產生以下輸出。
>>錯誤:找不到文件或讀取數據
如果我們使用一個空的 “except
” 子句,那么它將捕獲所有類型的異常。
然而,這既不是一個好的編程習慣,也沒有人推薦它。
這是因為這樣的 Python try-except
塊可以處理所有類型的異常。但是它不會幫助程序員找到導致問題的異常。
您可以通過以下代碼查看如何捕獲所有異常。
try: 你在這里做你的操作; ...................... except: 如果有任何異常,則執行此塊 ...................... else: 如果沒有異常則執行此塊
我們可以使用相同的 except
子句定義多個異常。這意味著如果 Python
解釋器找到匹配的異常,那么它將執行在 except
子句下編寫的代碼。
簡而言之,當我們這樣定義except
子句時,我們期望同一段代碼拋出不同的異常。此外,我們希望在每種情況下都采取相同的行動。
請參考下面的例子。
try: 你在這里做你的操作; ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 如果給定的異常列表中有任何異常, 然后執行這個塊 ...................... else: 如果沒有異常則執行此塊
我們還可以借助 try-finally
語句啟用 Python
異常處理。
使用 try
塊,我們還可以選擇定義“ finally
”塊。該子句允許定義我們想要執行的語句,無論 try 塊是否引發異常。
此功能通常在釋放外部資源時出現。
這是幫助的編碼片段。
try: 你在這里做你的操作; ...................... 由于任何異常,這可能會被跳過 finally: 這將始終被執行 ......................
一個關鍵點是我們可以為每個 try 塊定義一個“ except
”或“ finally
”子句。你不能把這些放在一起。此外,您不應將“ else ”子句與“ finally
”子句一起使用。
讓我們舉一個例子來更清楚。
try: fob = open('test', 'w') fob.write("這是我在異常處理中驗證 try-finally 的測試文件") print 'try 塊執行' finally: fob.close() print 'finally 塊執行'
如果未發生異常,則您將看到以下輸出。
>>try 塊執行
>>finally 塊執行
假設我們以READ模式打開文件,然后嘗試對其執行寫操作。在這種情況下,下面的代碼將有助于處理異常。
try: fob = open('test', 'r') try: fob.write("這是我在異常處理中驗證 try-finally 的測試文件") print 'try 塊執行' finally: fob.close() print 'finally 塊執行以關閉文件' except IOError: print "錯誤:找不到文件或讀取數據"
在這種情況下,解釋器將引發異常,并顯示以下輸出。
>>finally 塊執行以關閉文件
>>錯誤:找不到文件或讀取數據
當某些代碼在 try 塊中引起異常時,執行會立即傳遞到“ finally
”塊。“ finally
”塊中的語句全部執行完畢后,異常恢復到“ except
”塊執行。但是必須存在“ try-except
”語句的下一個更高層。
我們可以使用 raise
關鍵字強制引發異常。
我們還可以選擇將值傳遞給異常并指定它發生的原因。
這是調用“ raise
”方法的語法。
raise [Exception [, args [, traceback]]]
在哪里,
在 “Exception
”下- 指定其名稱。
“ args
”是可選的,表示異常參數的值。
最后一個參數 “traceback
” 也是可選的,如果存在,則是用于異常的回溯對象。
讓我們舉一個例子來證明這一點。
>>> raise MemoryError Traceback (most recent call last): ... MemoryError >>> raise MemoryError("This is an argument") Traceback (most recent call last): ... MemoryError: This is an argument >>> try: a = int(input("Enter a positive integer value: ")) if a <= 0: raise ValueError("This is not a positive number!!") except ValueError as ve: print(ve) Following Output is displayed if we enter a negative number: Enter a positive integer: –5 This is not a positive number!!
自定義異常是程序員自己創建的異常。
他通過添加一個新類來做到這一點。這里的技巧是從基本異常類派生自定義異常類。
大多數內置異常也有相應的類。
>>> class UserDefinedError(Exception): ... pass >>> raise UserDefinedError Traceback (most recent call last): ... __main__.UserDefinedError >>> raise UserDefinedError("An error occurred") Traceback (most recent call last): ... __main__.UserDefinedError: An error occurred
在上面的代碼片段中,您可以看到我們創建了一個用戶定義的異常類,“ UserDefinedError
” 。它使用基 Exception
類作為父類。因此,新的用戶定義異常類將像任何其他異常類一樣引發異常,即通過調用帶有可選錯誤消息的“ raise
”語句。
讓我們舉個例子。
在此示例中,我們將展示如何在程序中引發用戶定義的異常并捕獲錯誤。
該程序提示用戶一次又一次地輸入字母表,直到他只輸入存儲的字母表為止。
為了尋求幫助,該程序會向用戶提供提示,以便他可以找出正確的字母表。此外,他可以檢查他的猜測是否高于或低于存儲的字母表。
#定義 Python 用戶定義的異常 class Error(Exception): """Base class for other exceptions""" pass class InputTooSmallError(Error): """Raised when the entered alpahbet is smaller than the actual one""" pass class InputTooLargeError(Error): """Raised when the entered alpahbet is larger than the actual one""" pass #我們的主程序 #用戶猜測一個字母,直到他/她猜對了 #你需要猜這個字母 alphabet = 'm' while True: try: apb = input("輸入一個字母: ") if apb < alphabet: raise InputTooSmallError elif apb > alphabet: raise InputTooLargeError break except InputTooSmallError: print("輸入的字母太小,再試一遍!") print('') except InputTooLargeError: print("輸入的字母太大,再試一遍!") print('') print("恭喜! 你猜對了")
讓我們通過提供不同的輸入來測試這個程序。
輸入一個字母:c 輸入的字母太小,再試一遍! 輸入一個字母:s 輸入的字母太大,再試一遍! 輸入一個字母:q 輸入的字母太大,再試一遍! 輸入一個字母:k 輸入的字母太小,再試一遍! 輸入一個字母:m 恭喜! 你猜對了
因此你可以看到我們在這個程序中定義了一個名為 Error 的基類。它引發了從基類派生的兩個異常(“ InputTooSmallError
”和“ InputTooLargeError
”)。這是在 Python
編程中定義用戶定義異常的標準方法。
以上是“Python異常處理的基本知識有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。