當前位置:
首頁 > 知識 > Python Exceptions介紹

Python Exceptions介紹

Python Exceptions介紹

目錄

  • 異常與語法錯誤

  • 拋出異常

  • AssertionError異常

  • try/except塊:處理異常

  • else語句

  • 使用finally語句做最後後清理

  • 匯總

Python程序一旦遇到錯誤就會終止。 在Python中,錯誤可能是語法錯誤或異常。 在本文中,您將看到什麼是異常以及它與語法錯誤的區別。 之後,您將了解如何拋出異常和做出斷言。 然後,您將看到try和except塊的演示。

Python Exceptions介紹

異常與語法錯誤

解析器檢測到錯誤的語句時會發生語法錯誤。 觀察下面的例子:

Python Exceptions介紹

箭頭指出解析器遇到語法錯誤的位置。 在這個例子中,多了一個右括弧。 刪除它並再次運行你的代碼:

Python Exceptions介紹

這一次,你遇到了一個異常錯誤。 無論何時語法正確的Python代碼導致錯誤,這種類型的錯誤就會發生。 消息的最後一行指出了遇到的異常錯誤類型。

Python不會顯示exception error消息,而是詳細說明遇到了什麼類型的異常錯誤。 在這種情況下,它是一個ZeroDivisionError。 Python帶有各種內置的異常,同樣也可以創建自定義異常。

拋出異常

如果某種條件發生,我們可以使用raise來拋出異常。 該聲明可以實現一個自定義異常。

Python Exceptions介紹

如果你想在某種情況發生時使用raise來拋出錯誤,你可以這樣做:

Python Exceptions介紹

當你運行這段代碼時,輸出如下:

Python Exceptions介紹

該程序停下來,並將異常顯示到屏幕,提供有關錯誤的線索。

AssertionError異常

與其等待程序中途崩潰,您還可以先在Python中進行斷言。 我們斷言某個條件得到滿足。 如果這種情況證明是True,那很好! 該程序可以繼續。 如果斷言結果為False,你可以讓程序拋出一個AssertionError異常。

Python Exceptions介紹

看看下面的例子,它斷言代碼將在Linux系統上執行:

Python Exceptions介紹

如果您在Linux機器上運行此代碼,則斷言會通過。 如果您要在Windows計算機上運行此代碼,則斷言的結果將為False,輸出如下所示:

Python Exceptions介紹

在這個例子中,拋出一個AssertionError異常是該程序最後一件事。 程序將停止並不再繼續。 如果這不是你想要的呢?

try和except塊:處理異常

Python中的try和except塊用於捕獲和處理異常。 Python將try語句之後的代碼作為程序的「正常」部分執行。 except語句後面的代碼是程序對前面的try子句中的任何異常的響應。

Python Exceptions介紹

正如您前面所看到的,當語法正確的代碼遇到錯誤時,Python將拋出異常錯誤。 如果該程序未處理它,該異常錯誤會使程序崩潰。 except子句決定程序如何響應異常。

以下函數可以幫助您了解try和except塊:

Python Exceptions介紹

linux_interaction只能在Linux系統上運行。 如果在除Linux以外的操作系統上調用該函數,則此函數中的斷言將引發AssertionError異常。

你可以使用下面的代碼試試這個函數:

Python Exceptions介紹

這裡處理錯誤的方式是直接使用pass。 如果您要在Windows機器上運行此代碼,您將得到以下輸出:

Python Exceptions介紹

沒有任何輸出。 這裡的好處是該程序沒有崩潰。 但是,如果您運行代碼時發現某種類型的異常,可能會好些。 為此,您可以將pass更改為可生成消息的內容,如下所示:

Python Exceptions介紹

在windows上執行這段代碼:

Python Exceptions介紹

當運行此函數的程序中發生異常時,程序將通知您函數調用不成功的事實同時繼續運行。

你沒有看到的是由於函數調用而拋出的錯誤類型。 為了準確地查看出了什麼問題,您需要捕捉函數拋出的錯誤。

以下代碼是捕獲AssertionError並將該消息輸出到屏幕的示例:

Python Exceptions介紹

在Windows上運行此功能會輸出以下內容:

Python Exceptions介紹

第一條消息是AssertionError,通知您該函數只能在Linux上執行。 第二條消息告訴你哪個功能沒有執行。

在前面的例子中,你調用了自己寫的一個函數。 當執行該函數時,捕獲了AssertionError異常並將其列印到屏幕上。

以下是另一個打開文件並使用內置異常的示例:

Python Exceptions介紹

如果file.log不存在,這段代碼將輸出以下內容:

Python Exceptions介紹

這是一條信息豐富的消息,我們的程序仍將繼續運行。 在Python文檔中,可以看到有很多可用的內置異常。 該頁面上描述的一個異常如下:

Python Exceptions介紹

要捕獲這種類型的異常並將其列印到屏幕上,可以使用以下代碼:

Python Exceptions介紹

在這種情況下,如果file.log不存在,則輸出如下所示:

Python Exceptions介紹

您可以在try子句中使用多個函數調用,並預計捕獲各種異常。 這裡需要注意的是,try子句中的代碼只要遇到異常就會停止。

  • 警告:捕捉異常會隱藏所有錯誤...即使是那些完全意外的錯誤。 這就是為什麼你應該避免在你的Python程序中使用空except子句。 相反,你會想要引用你想要捕獲和處理的特定異常類。 您可以在本教程中了解更多關於這樣做的好處。

看下面的代碼。 在這裡,你首先調用linux_interaction函數,然後嘗試打開一個文件:

Python Exceptions介紹

如果文件不存在,在Windows上運行此代碼將輸出以下內容:

Python Exceptions介紹

在try子句中,您立即遇到了異常,並沒有進入您嘗試打開file.log的部分。 現在看看在Linux上運行代碼時會發生什麼:

Python Exceptions介紹

關鍵要點如下

  • 執行try子句直到遇到第一個異常。

  • 在except子句或異常處理程序中,您可以確定程序如何響應異常。

  • 您可以預見多個異常,並區分程序應該如何響應它們。

  • 避免使用空except子句。

else子句

在Python中,使用else子句,只有在沒有異常的情況下,才能指示程序執行某個代碼塊。

Python Exceptions介紹

看一下下面的例子:

Python Exceptions介紹

如果您要在Linux系統上運行此代碼,則輸出結果如下所示:

Python Exceptions介紹

由於該程序沒有遇到任何異常,因此執行了else子句。

您還可以嘗試在else子句中運行代碼,並捕獲可能的異常:

Python Exceptions介紹

如果您要在Linux上執行此代碼,您將得到以下結果:

Python Exceptions介紹

從輸出中,您可以看到linux_interaction函數運行。 由於沒有遇到任何異常,因此嘗試打開file.log。 由於該文件不存在而無法打開,引發了FileNotFoundError異常

使用finally語句做最後後清理

想像一下,執行代碼後,你總是必須執行某種操作來清理。 Python可以使用finally子句進行操作。

Python Exceptions介紹

來看看下面的例子:

Python Exceptions介紹

在前面的代碼中,finally子句中的所有內容都將被執行。 即使在try或else子句中遇到異常,也不會影響finally子句的執行。 在Windows上運行以前的代碼將輸出以下內容:

Python Exceptions介紹

匯總

在看到語法錯誤和異常之間的區別之後,您了解了在Python中拋出,捕獲和處理異常的各種方法。 在本文中,您看到了以下選項:

  • raise允許你隨時拋出異常。

  • assert使您能夠驗證是否符合某個條件,如果不符合則拋出異常。

  • 在try子句中,遇到異常之前的所有語句都會執行。

  • except用於捕獲和處理try子句中遇到的異常。

  • else使你可以編寫只有在try子句中沒有遇到任何異常時才能運行的代碼。

  • finally使您能夠執行應始終運行的代碼段,無論是否遇到任何異常。

希望這篇文章能夠幫助您理解Python在處理異常時提供的基本工具。


英文原文:https://realpython.com/python-exceptions/
譯者:javylee

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

Python3.7中一種懶載入的方式
Flask 1.0發布

TAG:Python部落 |