CodeGym /Khóa học Java /Python SELF VI /Ghi log và xử lý lỗi để đảm bảo hoạt động ổn định cho scr...

Ghi log và xử lý lỗi để đảm bảo hoạt động ổn định cho script

Python SELF VI
Mức độ , Bài học
Có sẵn

1. Ghi log

Hôm nay chúng ta sẽ khám phá một chủ đề có thể cứu bạn khỏi rất nhiều rắc rối và thời gian quý báu — đó là ghi log và xử lý lỗi. Ngay cả lập trình viên giỏi nhất cũng không tránh khỏi lỗi, và nhiệm vụ của bạn là làm cho những lỗi này dễ dự đoán và quản lý được. Hãy tưởng tượng bạn là một nhà khảo cổ học đang thám hiểm, và nhiệm vụ của bạn là bảo vệ đoàn thám hiểm của mình khỏi những cú sập hoặc cái bẫy hiểm hóc — thì ghi log và xử lý lỗi chính là la bàn và tấm khiên tin cậy của bạn trong cuộc phiêu lưu đầy rủi ro này!

Khi nói đến ghi log trong lập trình, tức là chúng ta đang bàn về việc ghi lại thông tin về hoạt động của chương trình. Đây là các quá trình xảy ra bên trong code của bạn và có thể không nhìn thấy ngay từ đầu. Ghi log giống như bạn để lại các dấu vết, giống như Hansel và Gretel để lại mẩu bánh mì trong rừng để tìm đường về nhà.

Cài đặt và cấu hình ghi log

Bắt đầu với các công cụ cơ bản trong Python nào. Để ghi log, chúng ta sẽ sử dụng module logging. Đây là "dao đa năng" của bạn để ghi lại thông tin về tiến trình chạy của chương trình.

Python

import logging

# Cấu hình logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Ví dụ sử dụng
logging.info("Bắt đầu chạy script")
logging.error("Đây là lỗi")

        

Các mức ghi log phổ biến là gì?

  • DEBUG: mức thông tin chi tiết nhất, thường chỉ quan tâm khi chẩn đoán lỗi.
  • INFO: xác nhận rằng các quá trình đang hoạt động như mong đợi.
  • WARNING: chỉ ra điều gì đó bất ngờ và có thể gây vấn đề, nhưng chương trình vẫn đang hoạt động.
  • ERROR: các lỗi nghiêm trọng khiến chức năng không thể thực hiện được.

Bạn có thể cấu hình mức ghi log để lọc thông tin. Ví dụ, nếu bạn chỉ quan tâm đến lỗi và cảnh báo, hãy đặt mức logging.WARNING.

Ví dụ ghi log trong Selenium

Xem thử cách ghi log có thể được áp dụng trong một dự án với Selenium:

Python

from selenium import webdriver

# Cấu hình logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

try:
    logging.info("Khởi tạo driver Chrome")
    driver = webdriver.Chrome()
    logging.info("Mở trang Python.org")
    driver.get("https://www.python.org")
    logging.info("Kết thúc thành công")
except Exception as e:
    logging.error(f"Xảy ra lỗi: {e}")
finally:
    driver.quit()

        

Ví dụ này minh họa cách tích hợp ghi log trong script Selenium của bạn để theo dõi quá trình thực hiện. Chúng ta sử dụng try, exceptfinally để xử lý lỗi — chúng ta sẽ nói thêm về điều này ở phần dưới.

2. Xử lý lỗi trong Selenium

Trong lập trình, cũng như trong cuộc sống, lỗi là điều không thể tránh khỏi. Tuy nhiên, chúng ta có thể kiểm soát cách phản ứng với chúng. Sử dụng try, except, elsefinally cho phép bắt và xử lý lỗi một cách thanh lịch.

Nhớ lại cách làm việc với ngoại lệ

Cùng nhớ lại cách xử lý ngoại lệ nào:

Python

try:
    # Code có thể gây ra lỗi
    result = 10 / 0
except ZeroDivisionError as e:
    # Code được thực thi nếu có lỗi ZeroDivisionError
    logging.error("Không thể chia cho 0!")
else:
    # Code được thực thi nếu không có lỗi
    logging.info("Thao tác thành công")
finally:
    # Code được thực thi trong mọi trường hợp
    logging.info("Kết thúc thao tác")

        

Code trong block try sẽ được thực thi. Nếu xảy ra lỗi kiểu ZeroDivisionError, code trong block except sẽ được thực thi, và chương trình sẽ không bị crash. Block else được sử dụng để thực hiện code nếu không có lỗi xảy ra. Và cuối cùng, block finally luôn luôn được thực thi, bất kể có lỗi hay không.

Xử lý lỗi trong Selenium

Selenium cung cấp một số ngoại lệ tích hợp sẵn để xử lý các tình huống khác nhau. Đây là một số ngoại lệ hữu ích và cách sử dụng chúng.

  1. NoSuchElementException — xảy ra khi không tìm thấy phần tử. Sử dụng nó để kiểm tra sự tồn tại của phần tử.
    Python
    
    try:
        element = driver.find_element(By.ID, "element_id")
    except NoSuchElementException:
        logging.warning("Không tìm thấy phần tử với ID 'element_id'.")
    
                    
  2. TimeoutException — xảy ra khi phần tử mong đợi không xuất hiện trên trang trong thời gian quy định. Dùng nó để quản lý các kỳ vọng.
    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("Đợi phần tử với ID 'element_id' thất bại.")
    
                    
  3. ElementClickInterceptedException — xảy ra khi phần tử bị chặn bởi một phần tử khác và không thể click. Hữu ích khi click vào các phần tử bị che bởi popup.
    Python
    
    from selenium.common.exceptions import ElementClickInterceptedException
    
    try:
        driver.find_element(By.ID, "button_id").click()
    except ElementClickInterceptedException:
        logging.warning("Phần tử bị chặn bởi một phần tử khác và không thể click được.")
    
                    

Thử lại và logic phục hồi

Để tăng độ bền cho script của bạn, có thể thực hiện cơ chế thử lại khi xảy ra lỗi. Ví dụ, nếu trang web tạm thời không truy cập được hoặc phần tử không tìm thấy, script có thể thử lại vài lần trước khi kết thúc với lỗi.

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"Tìm thấy phần tử: {value}")
            return element
        except NoSuchElementException:
            attempt += 1
            logging.warning(f"Thử lần {attempt} thất bại, thử lại sau 2 giây...")
            time.sleep(2)
    logging.error(f"Không tìm thấy phần tử sau {retries} lần thử.")
    return None

        

Lời khuyên về độ bền và độ tin cậy của script

  • Sử dụng chờ đợi rõ ràng: Thiết lập chờ đợi rõ ràng cho các phần tử xuất hiện không ngay lập tức. Điều này sẽ giảm số lỗi do độ trễ tải.
  • Thêm block try-except trong từng bước: Điều này cho phép ghi log lỗi và tránh ngắt script khi có sự cố nhỏ.
  • Thử lại với các bước quan trọng: Nếu lỗi có thể là tạm thời, hãy thiết lập thử lại với khoảng cách vài giây.
  • Ghi log từng bước: Ghi log từng phần quan trọng giúp phân tích quá trình thực hiện script và phát hiện lỗi tiềm ẩn.
  • Cấu hình thông báo khi xảy ra lỗi nghiêm trọng: Ví dụ, bạn có thể gửi email hoặc tin nhắn tới nhóm chat nếu log ghi nhận lỗi mức CRITICAL.

3. Sử dụng log một cách hiệu quả

Giờ đây, khi bạn đã học cách ghi log và xử lý lỗi, hãy tiến thêm một bước và khám phá cách tận dụng tốt nhất từ log.

Chọn nơi và định dạng log

Sử dụng file để lưu log nếu bạn muốn giữ nó để phân tích. Giống như viết nhật ký, bạn có thể đọc lại và phân tích để tránh các lỗi trong tương lai. Cấu hình ghi log vào file nào:

Python

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

# Giờ mọi log sẽ được lưu trong app.log
logging.info("Bắt đầu ghi log vào file.")

        

Phân tích log

Phân tích log của bạn để xác định các lỗi thường gặp hoặc vấn đề hiệu suất. Có thể script của bạn chỉ gặp vấn đề vào những ngày hoặc khoảng giờ nhất định, và điều này sẽ được phát hiện khi nghiên cứu kỹ log. Phân tích này là "quy trình thám tử" cá nhân của bạn, giúp hiểu hơn về cách ứng dụng hoạt động.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION