Hoàn toàn làm chủ xử lý ngoại lệ trong Python|Cách sử dụng và các phương pháp hay nhất với try-except

1. Tổng quan về xử lý ngoại lệ trong Python

Xử lý ngoại lệ trong Python là gì?

Trong quá trình thực thi chương trình, có thể xảy ra các lỗi không mong muốn. Những lỗi này được gọi là “ngoại lệ”, và khi xảy ra, chương trình thường sẽ bị dừng lại. Python cung cấp cơ chế xử lý ngoại lệ để giúp xử lý các lỗi này. Bằng cách sử dụng xử lý ngoại lệ, chương trình có thể phản ứng phù hợp với lỗi và tiếp tục hoạt động mà không bị gián đoạn.

Tại sao xử lý ngoại lệ quan trọng?

Xử lý ngoại lệ rất quan trọng để đảm bảo chương trình có thể tiếp tục chạy một cách thân thiện với người dùng ngay cả khi gặp lỗi. Ngoài ra, nó giúp xác định nguyên nhân của lỗi, làm cho quá trình gỡ lỗi dễ dàng hơn và tạo ra các chương trình đáng tin cậy hơn.

2. Câu lệnh try-except là gì?

Cấu trúc cơ bản

Câu lệnh try-except trong Python cho phép bạn đặt mã có thể gây ra lỗi vào khối try và xử lý lỗi đó trong khối except. Dưới đây là cấu trúc cơ bản:

try:
    # Mã có thể gây ra lỗi
except SomeError:
    # Mã xử lý lỗi

Nếu mã trong khối try được thực thi mà không có lỗi, khối except sẽ bị bỏ qua. Nhưng nếu xảy ra lỗi, Python sẽ xử lý ngoại lệ đó theo cách đã được chỉ định.

Ví dụ phổ biến: Lỗi chia cho 0

Nếu bạn cố gắng chia một số cho 0, Python sẽ sinh ra ngoại lệ ZeroDivisionError. Bạn có thể xử lý lỗi này như sau:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Không thể chia cho 0")

 

3. Các ngoại lệ thường gặp và cách xử lý

1. ZeroDivisionError

Ngoại lệ này xảy ra khi bạn cố gắng chia một số cho 0. Ví dụ, nếu bạn cố thực hiện phép chia với 0, Python sẽ tự động đưa ra ngoại lệ ZeroDivisionError.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Không thể chia cho 0")

2. ValueError

ValueError xảy ra khi một giá trị không hợp lệ được truyền vào một hàm hoặc phép toán. Ví dụ dưới đây minh họa việc cố gắng chuyển đổi một chuỗi không phải số sang kiểu số nguyên bằng int().

try:
    num = int("not_a_number")
except ValueError:
    print("Giá trị không hợp lệ")

3. Xử lý nhiều ngoại lệ cùng lúc

Nếu muốn xử lý nhiều loại ngoại lệ cùng một lúc, bạn có thể liệt kê chúng trong một khối except như sau:

try:
    result = 10 / "string"
except (ZeroDivisionError, TypeError):
    print("Đã xảy ra lỗi")

4. Lấy thông tin chi tiết của lỗi với đối tượng ngoại lệ

Sử dụng as để lấy đối tượng ngoại lệ

Trong câu lệnh except, bạn có thể sử dụng từ khóa as để lấy đối tượng ngoại lệ. Điều này giúp bạn có thể xem chi tiết lỗi hoặc ghi lại lỗi trong nhật ký.

try:
    a = 10 / 0
except ZeroDivisionError as e:
    print(f"Lỗi đã xảy ra: {e}")

Trong đoạn mã trên, khi xảy ra ZeroDivisionError, biến e sẽ chứa thông tin chi tiết về lỗi và in ra màn hình.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. Cách sử dụng khối finally

finally là gì?

Khối finally được sử dụng để đảm bảo một đoạn mã nào đó luôn được thực thi, bất kể có xảy ra ngoại lệ hay không. Điều này đặc biệt hữu ích trong các thao tác như mở file hoặc quản lý kết nối cơ sở dữ liệu.

try:
    file = open("test.txt", "r")
except FileNotFoundError:
    print("Không tìm thấy tệp")
finally:
    print("Kết thúc thao tác với tệp")

Giải phóng tài nguyên

Khối finally rất hữu ích để đảm bảo tài nguyên luôn được giải phóng, chẳng hạn như đóng tệp sau khi sử dụng.

try:
    file = open("data.txt", "r")
    # Thực hiện các thao tác với file
finally:
    file.close()

Nhờ sử dụng finally, chúng ta đảm bảo rằng file luôn được đóng ngay cả khi xảy ra lỗi.

6. Gây ra ngoại lệ thủ công bằng raise

Vai trò của raise

Bạn có thể sử dụng từ khóa raise để tạo ra ngoại lệ theo ý muốn. Điều này hữu ích khi bạn muốn kiểm tra dữ liệu đầu vào hoặc xác định các điều kiện sai lệch trong chương trình.

def check_value(value):
    if value < 0:
        raise ValueError("Không chấp nhận giá trị âm")

Ví dụ về ngoại lệ tùy chỉnh

Bằng cách tạo ngoại lệ thủ công, bạn có thể ngăn chặn các giá trị đầu vào không hợp lệ và đảm bảo chương trình chạy đúng cách.

7. Các phương pháp hay nhất khi xử lý ngoại lệ trong Python

1. Tránh lạm dụng xử lý ngoại lệ

Nếu sử dụng quá nhiều xử lý ngoại lệ, mã nguồn sẽ trở nên khó đọc và khó bảo trì. Chỉ nên sử dụng khi thực sự cần thiết để không làm ảnh hưởng đến luồng chương trình.

2. Ghi lại lỗi bằng log

Việc ghi lại thông tin lỗi trong nhật ký giúp bạn dễ dàng theo dõi và sửa lỗi sau này. Dưới đây là một ví dụ sử dụng module logging.

import logging

try:
    a = 10 / 0
except ZeroDivisionError as e:
    logging.error(f"Lỗi đã xảy ra: {e}")

3. Tránh sử dụng except Exception một cách chung chung

Trong xử lý ngoại lệ, tốt nhất là chỉ bắt các lỗi cụ thể thay vì sử dụng except Exception. Việc này giúp bạn xác định chính xác lỗi và xử lý phù hợp hơn.