try 語句是 Python 中處理異常的重要語句,它的作用是在異常發生時處理程式,使程式能夠繼續執行而不是完全停止。 正確使用 try 語句是編寫可靠 Python 程式的關鍵。
本文將讓你全面了解 try 的語法用法和工作原理,以及 except、else 的用法,最後是 try 經常使用它的語句。 通過詳細的案例,您將能夠熟練掌握嘗試的各種用法,並將它們熟練地應用到實際的 python 中。
try 語句的基本語法結構為:
如果 try 塊在執行過程中發生異常,則 try 塊的剩餘 ** 不會繼續執行,而是會直接跳轉到 except 塊,except 塊會捕捉到異常並執行 except 塊中的 **。
使用這種機制,我們可以處理 try 塊中的異常,以便程式不會因異常而終止。 例如:
在上面的示例中,我們在 try 塊中獲取使用者輸入並將其轉換為整數,但如果使用者輸入其他內容而不是整數,int() 將產生 valueerror 異常。 在這種情況下,try 中的另乙個 ** 不會繼續執行,直譯器會直接跳轉到 except 塊進行處理。
除了 valueerror 之外,try 塊中的 ** 還會產生各種其他異常事件。 try-except 可以捕獲各種不同的異常。
try-except 工作流程的簡要總結:
在 try 塊中執行 **。
如果 try 塊中沒有發生異常,則在執行完 try 塊的所有 ** 後,程式繼續向下執行。
如果在 try 塊中生成異常,則不會執行 try 塊的剩餘 **。 直譯器查詢相關的 except 塊,在其中執行 **,然後繼續向下。
通過這種機制,我們可以處理 try 塊中的異常,讓程式繼續執行,而不是因為異常而完全崩潰。 這使我們的程式更加強大和可靠。
在上面的示例中,我們使用 except 塊進行了簡單的異常處理。 但實際上還有很多事情要做。
except 語句用於定義處理 try 語句中的異常的過程。 基本語法如下:
當 try 部分發生 exceptionType 異常時,將執行 except 塊。 我們可以通過指定不同的異常型別來處理不同型別的異常。 例如:
如果在開啟檔案時發生 ioerror(例如檔案不存在),則將執行 print('Unable to open the file')如果 valueerror 型別異常(檔案包含無法轉換為整數的奇怪字元),則執行列印(“檔案包含奇怪字元”)。
如果未捕獲到匹配的異常,則指令碼將停止,就好像 try 語句不存在一樣,並報告錯誤。
我們還可以使用 except:,它等價於 except exception:,而無需指定異常型別
一般來說,對於不同的處理方式,需要區分不同型別的例外。 除非您不關心異常詳細資訊,否則您只想簡單地捕獲所有異常。
指定多個 except 塊可以分別處理不同的異常
當匹配多個 except 語句時,從上到下匹配異常,一旦匹配到異常,則執行對應的 except 塊並彈出整個 try 語句(後續的 except 將不被判定)。
所以通常把一般的例外放在最後:
不要忘記,預設情況下,即使是由 except 塊處理的異常也不會在將來繼續執行。 除非使用 try-else 語句,否則請參見下文。
在 try-except 語句中新增 else 語句,以指定在不發生異常時執行的 **:要執行
在上面的示例中,如果輸入整數,則將執行 try 塊中的兩行 **,然後是 print(else 語句中的 'done')。
如果輸入不是整數,導致 valueerror 異常,則 except 塊將列印“not an integer”,而 else 塊不會執行。
else 語句允許我們在 ** 正常執行時進行一些處理,或者清理列印輸出等操作。
無論是否發生異常,都會執行最後乙個子句。 用於釋放在 try 塊中開啟的資源。
無論開啟檔案時是否發生異常,檔案物件 f 最終都會顯式關閉,這比依賴 Python 的 GC** 更明確。
最後通常用於釋放外部資源。 例如關閉開啟的檔案、斷開網路連線等。
try 語句也可以巢狀,外部 except 塊可以捕獲內部 try 語句的異常。
這在某些情況下可能很有用,因為可以通過在外層新增另一層 try-except 來區分內部 try 生成的異常。
但是,多層巢狀的try語句也會使可讀性變差,包括過多的邏輯,在實踐中應避免過度巢狀。
有時我們只想記錄一些低階異常,我們不想因為這些異常而破壞整個程式。 此時,您可以選擇在 except 塊中捕獲指定的異常後不執行任何操作:
如上所述,通過捕獲但傳遞某些異常,我們可以防止這些“低階”異常影響系統的執行。
這在某些情況下很有用,例如,當特定的第三方模組有乙個已知的 bug 會引發奇怪的異常時,但如果未呼叫該模組,則整個專案將不會執行。 此時,我們可以考慮使用 try-except 來捕獲異常,以防止異常影響主程式。
當然,最好解決異常的根本原因。 從長遠來看,試圖掩蓋這樣的異常情況並不是一件好事。
通過將異常變數的名稱繫結到 except,我們可以捕獲 try 中生成的異常錯誤物件,從而通過這個異常物件獲取異常的詳細資訊,例如錯誤資訊等
這樣,我們就可以通過 except 塊中的異常例項 ex 獲取更豐富的異常資訊,用於後續處理。
sys 模組sys.excepthook
可用於向所有未處理的異常新增 ** 函式。
我們可以完成設定sys.excepthook
要為所有未處理的異常實現自定義處理邏輯,請執行以下操作:
這有助於全域性異常處理。 sys 模組中還有一些其他與異常相關的工具,例如用於丟擲異常的工具sys.exit()
並檢查異常引數sys.exc_info()
等。
異常處理有很多樣板,如果每個函式只寫一次會很麻煩。 我們可以用 python 裝飾器來簡化這一點
這樣,我們就可以在函式中新增乙個@catch異常裝飾器,去掉函式中重複的異常處理樣板,讓核心業務邏輯更加簡潔。
異常裝飾器函式是一種常見的 Python 開發模式,可大大減少重複。 如果你的專案使用 Flask Django 框架,它們還內建了乙個模組化的異常裝飾器來簡化異常處理。
由於 try except 語句的異常處理機制,使用 try except 必然會帶來一定的效能開銷。
主要體現在:
即使沒有異常,try except 塊也會略微增加函式執行時間。
當發生異常時,由於執行跳轉和建立異常物件,處理時間會更長。
通常,微秒範圍內這種略高的開銷可以忽略不計,但如果您有嚴格的效能要求或在效能敏感的環境中執行,那麼這個開銷值得關注。
為了量化 try except 的效能影響,我們可以簡單地編寫幾個指標示例:
無異常:
如您所見,即使沒有例外,新增乙個空的 try except 塊也會增加大約 2 倍的額外執行時間。
同樣,在異常的情況下,try except 的開銷會進一步增加:
存在異常:
可以看出,使用 try 顯著增加了異常處理時間,但直接執行的異常沒有 try 除外。
當然,微秒級的開銷是可以接受的,為了使程式健壯,這是值得的。 但是,如果您的應用程式對效能非常關鍵,並且需要頻繁使用 try except,則這些開銷可能會增加整體運營效率。
在這種情況下,您可以通過一些優化措施來減少開銷,例如:
除非必要,否則請使用 try,不要新增它。
將多個 try except 合併為乙個語句。
當您不需要獲取異常詳細資訊時,可以避免建立異常例項。
最後是塊,而不是其他塊,在沒有異常的情況下也需要執行。
等一會。 正確使用 try except 需要在健壯性和執行效率之間取得平衡。
到目前為止,我們已經全面介紹了 try 的語法和除 Python 之外的各種詳細用法。 它的工作原理是捕獲和處理程式執行期間可能發生的異常和錯誤,防止程式崩潰並允許**繼續。
主要內容回顧:
try except 的句法結構和異常捕獲機制。
使用 except 塊處理不同型別的異常。
else 語句在沒有異常時執行。
最後語句釋放資源。
通過異常例項獲取有關異常的詳細資訊。
使用 sysExcepthook 自定義全域性異常處理。
使用修飾器簡化模板的例外情況。
嘗試 Except、Performance Overhead 等。
通過靈活組合 try except else finally 語句,我們可以編寫出非常健壯和容錯的 Python。
希望本文能幫助您以簡單的方式了解 try 的所有用法,並在 Python 程式設計中正確、熟練地使用它們。
#python#