Python Requests 模組的異常處理


Python Requests 是一個流行的庫,用於在 Python 中傳送 HTTP 請求。它提供了一種簡單直觀的方法來與網站和 API 互動。但是,與任何其他程式設計任務一樣,在使用 Requests 模組時,正確處理異常至關重要。透過使用異常處理,您可以優雅地處理錯誤,並防止程式崩潰或產生意外的結果。本文將介紹一些最佳實踐,並探討 Python Requests 模組異常處理的重要性。

  • 理解異常

    在 Python 中,異常是在程式執行期間中斷正常指令流的事件。當遇到異常時,程式會停止執行,並跳轉到特定的異常處理塊。透過異常處理,您可以捕獲並正確處理這些異常。

  • Requests 中常見的異常

    在處理 HTTP 請求時,Requests 模組可能會引發多種異常。瞭解這些異常可以幫助您更有效地處理錯誤。您可能會遇到以下常見異常:

    • ConnectionError: 當無法連線到伺服器時引發此異常。這可能是由於多種原因造成的,例如 DNS 解析問題或連線被拒絕。

    • Timeout: 當請求超時且沒有收到回覆時引發此異常。這可能發生在伺服器響應緩慢或存在網路問題時。

    • TooManyRedirects: 當請求重定向次數超過允許的次數時引發此異常。重定向是指伺服器將客戶端導向另一個 URL。

    • HTTPError: 對於失敗的 HTTP 響應(狀態碼 400 及以上)引發此異常。這意味著伺服器返回了錯誤狀態碼作為響應。

    • RequestException: Requests 模組的預設異常類。它包含在處理請求期間可能出現的各種異常型別。

基本的異常處理

為了處理 Requests 模組中的異常,您可以使用 try-except 塊。try 塊包含可能引發異常的程式碼,而 except 塊在發生異常時處理異常。以下是一個示例:

import requests

try:
    response = requests.get("https://example.com")
    response.raise_for_status()  # Raise an exception for unsuccessful HTTP status codes
    print("Request successful!")
except requests.exceptions.RequestException as e:
    print("An error occurred:", e)

在上面的示例中,requests.get() 函式在 try 塊中呼叫。如果發生異常,except 塊會捕獲它並列印一條錯誤訊息。`raise_for_status()` 方法用於在 HTTP 狀態碼不成功時引發異常。

處理特定異常

您可以透過單獨捕獲每個異常來處理特定異常。這使您可以根據異常型別採取不同的操作。例如:

import requests

try:
    response = requests.get("https://example.com")
    response.raise_for_status()
    print("Request successful!")
except requests.exceptions.ConnectionError:
    print("A connection error occurred. Please check your internet connection.")
except requests.exceptions.Timeout:
    print("The request timed out.")
except requests.exceptions.HTTPError as e:
    print("HTTP Error:", e)
except requests.exceptions.RequestException as e:
    print("An error occurred:", e)

在這個例子中,ConnectionError 和 Timeout 異常被分別捕獲,以便您可以對它們進行不同的處理。

處理多個異常

您還可以在一個 except 塊中處理多個異常。這在您希望對多種異常型別執行相同操作時很有用。以下是一個示例:

import requests

try:
    response = requests.get("https://example.com")
    response.raise_for_status()
    print("Request successful!")
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
    print("A connection error or timeout occurred:", e)
except requests.exceptions.HTTPError as e:
    print("HTTP Error:", e)
except requests.exceptions.RequestException as e:
    print("An error occurred:", e)

在這個示例中,ConnectionError 和 Timeout 異常在一個 except 塊中一起被捕獲。

使用 finally 進行清理

finally 塊定義了無論是否發生異常都將始終執行的程式碼。它通常用於執行清理任務,例如釋放資源或關閉檔案。以下是一個示例:

import requests

try:
    response = requests.get("https://example.com")
    response.raise_for_status()
    print("Request successful!")
except requests.exceptions.RequestException as e:
    print("An error occurred:", e)
finally:
    # Clean up code (e.g., close files, release resources)
    print("Cleaning up...")

在這個例子中,finally 塊將無論是否發生異常都執行。它確保執行必要的清理操作。

引發自定義異常

有時您可能需要根據特定條件建立自己的自定義異常。這允許您在程式碼中進行更精確的錯誤處理。以下是一個示例:

import requests

class CustomException(Exception):
    pass

try:
    response = requests.get("https://example.com")
    if response.status_code != 200:
        raise CustomException("Unexpected status code: " + str(response.status_code))
    print("Request successful!")
except requests.exceptions.RequestException as e:
    print("An error occurred:", e)
except CustomException as e:
    print("Custom Exception:", e)

如果響應狀態碼不是 200,則定義並引發名為 CustomException 的自定義異常。您可以編寫自己的異常類來處理特定於您的應用程式的情況。

記錄異常

異常處理不僅僅是列印錯誤訊息。為了有效地捕獲和分析錯誤,必須正確地記錄異常。為此,可以使用 Python 的 logging 模組。以下是一個示例:

import requests
import logging

logging.basicConfig(filename="error.log", level=logging.ERROR)

try:
    response = requests.get("https://example.com")
    response.raise_for_status()
    print("Request successful!")
except requests.exceptions.RequestException as e:
    logging.error("An error occurred: %s", e)

在這個示例中,logging.error() 方法用於將異常記錄到名為“error.log”的檔案中,級別為 ERROR。記錄異常使您可以稍後檢視和除錯問題。

結論

在使用 Python Requests 模組時,異常處理對於優雅地處理錯誤並確保程式碼的可靠性至關重要。透過理解常見的異常、使用 try-except 塊、處理特定異常以及記錄錯誤,您可以構建可靠的應用程式,能夠成功地處理意外情況。在分析和處理異常時,務必考慮您的特定用例。正確的異常處理可以提高基於 Python Requests 的應用程式的穩定性和健壯性。

更新於:2023年7月20日

9K+ 瀏覽量

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告