CodeGym /Java Adesua /Python SELF TW /記錄日誌和錯誤處理,讓腳本更穩定

記錄日誌和錯誤處理,讓腳本更穩定

Python SELF TW
等級 38 , 課堂 0
開放

1. 記錄日誌

今天我們要深入探討一個能幫助你減少不少麻煩和節省寶貴時間的主題——記錄日誌和錯誤處理。即使是最有經驗的程式設計師也無法完全避免錯誤,而你的目標是讓這些錯誤變得可預測且可控。想像一下,你是一個考古學家,在挖掘期間你的任務是保護你的探險隊免受意外坍塌和險惡陷阱的影響,而記錄日誌和錯誤處理就是你在這危險旅程中的指南針和盾牌!

當我們討論程式設計中的記錄日誌時,我們指的是記錄程式活動資訊的過程。這些是程式中發生的動作,可能第一眼看不出來。記錄日誌時,就像糖果屋中的漢賽爾與葛麗特留下的麵包屑一樣,你為自己留下了線索,以便日後返回。

安裝與設置記錄日誌

先從 Python 的基礎工具開始。我們將用到內建模組 logging。這是你記錄程式執行情況的瑞士刀工具。

Python

import logging

# 設置記錄日誌
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 使用範例
logging.info("腳本開始執行")
logging.error("發生錯誤")

        

有哪些記錄日誌的等級?

  • DEBUG: 最詳細的資訊,通常在診斷問題時感興趣。
  • INFO: 確認程式正常運行的過程。
  • WARNING: 指出非預期事件和可能的問題,但程式仍然可以運行。
  • ERROR: 僅當發生重大錯誤,導致功能無法執行時使用。

你可以通過設置記錄日誌的等級來過濾資訊。例如,如果你只關心錯誤和警告,設置等級為 logging.WARNING

Selenium 中的記錄日誌範例

我們來看看記錄日誌如何應用於使用 Selenium 的專案中:

Python

from selenium import webdriver

# 設置記錄日誌
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

try:
    logging.info("初始化 Chrome 瀏覽器")
    driver = webdriver.Chrome()
    logging.info("打開 Python.org 網頁")
    driver.get("https://www.python.org")
    logging.info("成功完成作業")
except Exception as e:
    logging.error(f"發生錯誤: {e}")
finally:
    driver.quit()

        

此範例展示了如何將記錄日誌整合到 Selenium 腳本中,來追蹤執行情況。我們使用 tryexceptfinally 來處理錯誤——稍後將更詳細介紹。

2. 在 Selenium 中處理錯誤

在程式設計中,就像生活一樣,錯誤是不可避免的。然而,我們可以控制如何對其作出反應。使用 try, except, elsefinally 可以優雅地捕捉和處理錯誤。

回顧異常處理

我們來回顧一下異常處理是如何工作的:

Python

try:
    # 可能導致異常的程式碼
    result = 10 / 0
except ZeroDivisionError as e:
    # 當出現 ZeroDivisionError 時執行的程式碼
    logging.error("無法進行除以零的操作!")
else:
    # 如果沒有異常執行的程式碼
    logging.info("操作成功完成")
finally:
    # 不論是否發生錯誤都會執行的程式碼
    logging.info("操作已結束")

        

放在 try 區塊中的程式碼將被執行。發生 ZeroDivisionError 類型錯誤時,將執行 except 區塊中的程式碼,程式不會中止。else 區塊用於當沒有異常發生時執行程式碼。最後,finally 區塊無論有無錯誤都會執行。

處理 Selenium 中的錯誤

Selenium 提供了一系列內建異常來處理不同的情況。下面列出了一些有用的異常及其使用方法。

  1. NoSuchElementException —— 當找不到元素時觸發。可用於檢查元素的可用性。
    Python
    
    try:
        element = driver.find_element(By.ID, "element_id")
    except NoSuchElementException:
        logging.warning("找不到 ID 為 'element_id' 的元素。")
    
                    
  2. TimeoutException —— 當預期的元素未在設定時間內出現時觸發。用於管理等待操作。
    Python
    
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "element_id"))
        )
    except TimeoutException:
        logging.error("等待 ID 為 'element_id' 的元素超時。")
    
                    
  3. ElementClickInterceptedException —— 當元素被其他物件擋住,無法點擊時觸發。在點擊可能被彈窗遮擋的元素時特別有用。
    Python
    
    from selenium.common.exceptions import ElementClickInterceptedException
    
    try:
        driver.find_element(By.ID, "button_id").click()
    except ElementClickInterceptedException:
        logging.warning("元素被其他元件擋住,無法點擊。")
    
                    

重試與恢復邏輯

為了提升腳本的穩定性,可以在發生錯誤時實現重試機制。例如,如果網站暫時不可用或未找到某個元素,腳本可以嘗試多次執行操作,然後在確定失敗後退出。

Python

import time

def retry_find_element(driver, by, value, retries=3):
    attempt = 0
    while attempt < retries:
        try:
            element = driver.find_element(by, value)
            logging.info(f"找到元素: {value}")
            return element
        except NoSuchElementException:
            attempt += 1
            logging.warning(f"第 {attempt} 次嘗試失敗,2 秒後重試...")
            time.sleep(2)
    logging.error(f"嘗試 {retries} 次後仍無法找到元素。")
    return None

        

腳本穩定性與可靠性的建議

  • 使用顯性等待: 對於那些並非立即出現的元素,設定顯性等待可以減少由於加載延遲引起的錯誤。
  • 在每一步驟加上 try-except 區塊: 這將允許記錄錯誤並避免腳本因小問題中止。
  • 為關鍵步驟設置重試機制: 如果某些錯誤可能是暫時性的,設置幾秒間隔的重試機制。
  • 記錄每一步驟: 記錄每個關鍵步驟,有助於分析腳本執行情況並捕捉隱藏的錯誤。
  • 設置關鍵錯誤的通知機制: 例如,如果日誌中記錄了 CRITICAL 等級的錯誤,可以發送電子郵件或聊天訊息。

3. 善用日誌記錄

現在,我們已經學會了記錄日誌和處理錯誤,接著我們來學習如何從日誌中獲得最大的效益。

選擇日誌的存儲位置和格式

如果你希望保存日誌以供分析,請將日誌記錄到檔案中。這就像寫日記,你可以反覆閱讀並分析,以避免將來犯下同樣的錯誤。以下是將日誌記錄到檔案的設定:

Python

logging.basicConfig(filename='app.log', filemode='w', level=logging.INFO)

# 現在所有日誌都會保存到 app.log 檔案中
logging.info("開始將日誌記錄到檔案中。")

        

分析日誌

分析你的日誌,以找出常見錯誤或效能問題。你的腳本可能僅在某些特定的日子或時間遇到問題,而這些只有通過詳細的日誌分析才能察覺。這是一個個人化的偵探過程,有助於更好地了解你的程式如何工作。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION