Quản lý lỗi trong Python

Quản lý lỗi (hay còn gọi là Xử lý ngoại lệ - Exception Handling) trong Python là một kỹ thuật quan trọng giúp bạn xử lý các tình huống bất ngờ mà chương trình có thể gặp phải trong quá trình thực thi, giúp chương trình không bị dừng đột ngột.

  1. Các loại lỗi trong Python
  2. Câu lệnh try-except
  3. Ví dụ về xử lý ngoại lệ đơn giản
  4. Xử lý nhiều loại lỗi
  5. Khối else trong try-except
  6. Khối finally trong try-except
  7. Tạo lỗi tùy chỉnh try-except
  8. Một số ngoại lệ thông dụng trong Python
  9. Tóm tắt về xử lý ngoại lệ trong Python
  10. Một số ví dụ thực tế

1. Các loại lỗi trong Python

Trong Python, lỗi thường được chia thành hai loại chính

    Lỗi biên dịch (Syntax Errors): Là những lỗi xảy ra khi cú pháp của chương trình không đúng. Python sẽ báo lỗi ngay khi biên dịch chương trình.
    Lỗi thực thi (Runtime Errors): Xảy ra khi chương trình đang chạy, có thể là do chia cho 0, truy cập chỉ số ngoài phạm vi, v.v.

Các lỗi thông dụng trong Python

    ZeroDivisionError: Lỗi chia cho 0.
    IndexError: Lỗi khi truy cập phần tử ngoài phạm vi của danh sách.
    TypeError: Lỗi khi sử dụng kiểu dữ liệu không hợp lệ.
    ValueError: Lỗi khi truyền giá trị không hợp lệ cho hàm.

2. Câu lệnh try-except

Câu lệnh try-except trong Python giúp bạn bắt và xử lý lỗi khi chúng xảy ra. Nếu có lỗi trong khối try, Python sẽ chuyển sang khối except để xử lý lỗi.

Cú pháp cơ bản

try:
    # Đoạn mã có thể gây ra lỗi
    risky_code()
except SomeException as e:
    # Xử lý khi có lỗi
    print(f"Đã xảy ra lỗi: {e}")

3. Ví dụ về xử lý ngoại lệ đơn giản

try:
    # Cố gắng chia cho 0
    x = 10 / 0
except ZeroDivisionError as e:
    print(f"Lỗi: {e}")  # In ra thông báo lỗi


Kết quả:

Lỗi: division by zero

Trong ví dụ này, khi chương trình gặp lỗi chia cho 0, nó sẽ bắt lỗi đó và in ra thông báo lỗi thay vì dừng chương trình đột ngột.

4. Xử lý nhiều loại lỗi

Bạn có thể xử lý nhiều loại lỗi khác nhau bằng cách sử dụng nhiều khối except:

try:
    # Có thể gây lỗi kiểu dữ liệu không hợp lệ
    value = int(input("Nhập một số: "))
    result = 10 / value
except ZeroDivisionError:
    print("Lỗi: Không thể chia cho 0!")
except ValueError:
    print("Lỗi: Vui lòng nhập một số hợp lệ!")
except Exception as e:
    print(f"Lỗi không xác định: {e}")


Kết quả:

    Nếu bạn nhập một chuỗi không phải số, chương trình sẽ in ra "Lỗi: Vui lòng nhập một số hợp lệ!".
    Nếu bạn nhập 0, chương trình sẽ in ra "Lỗi: Không thể chia cho 0!".

5. Khối else trong try-except

Khối else sẽ được thực thi khi không có lỗi xảy ra trong khối try. Điều này giúp bạn thực hiện các hành động khi mã trong try chạy thành công.

try:
    value = int(input("Nhập một số: "))
    result = 10 / value
except ZeroDivisionError:
    print("Lỗi: Không thể chia cho 0!")
except ValueError:
    print("Lỗi: Vui lòng nhập một số hợp lệ!")
else:
    print(f"Kết quả là: {result}")


Nếu không có lỗi, chương trình sẽ in ra kết quả của phép chia.

6. Khối finally trong try-except

Khối finally sẽ luôn được thực thi, dù cho có lỗi hay không. Điều này rất hữu ích khi bạn cần làm một số công việc dọn dẹp (như đóng tệp hoặc giải phóng tài nguyên) sau khi thực thi một đoạn mã.

try:
    file = open("sample.txt", "r")
    # Đọc nội dung tệp
except FileNotFoundError:
    print("Tệp không tồn tại.")
finally:
    print("Đóng tệp.")
    file.close()  # Đảm bảo đóng tệp nếu nó được mở

7. Tạo lỗi tùy chỉnh try-except

Trong Python, bạn có thể tự tạo ra ngoại lệ (exceptions) của riêng mình bằng cách sử dụng raise. Điều này rất hữu ích khi bạn muốn tạo các lỗi đặc biệt trong chương trình của mình.

def check_positive_number(value):
    if value < 0:
        raise ValueError("Giá trị phải là số dương!")
    return value

try:
    result = check_positive_number(-5)
except ValueError as e:
    print(f"Lỗi: {e}")


Kết quả:

Lỗi: Giá trị phải là số dương!

8. Một số ngoại lệ thông dụng trong Python

Dưới đây là một số loại lỗi mà bạn có thể gặp phải trong Python và cách xử lý chúng:

    ZeroDivisionError: Lỗi khi chia cho 0.
    IndexError: Lỗi khi truy cập phần tử ngoài phạm vi của danh sách hoặc chuỗi.
    ValueError: Lỗi khi truyền giá trị không hợp lệ cho một hàm.
    KeyError: Lỗi khi truy cập khóa không tồn tại trong từ điển.
    FileNotFoundError: Lỗi khi tệp không tồn tại.

9. Tóm tắt về xử lý ngoại lệ trong Python

    try: Đoạn mã có thể gây lỗi.
    except: Bắt và xử lý lỗi.
    else: Thực thi nếu không có lỗi xảy ra.
    finally: Thực thi mã dọn dẹp bất kể có lỗi hay không.
    Tạo lỗi tùy chỉnh: Sử dụng raise để tạo lỗi riêng.

Quản lý lỗi giúp chương trình của bạn trở nên ổn định hơn, dễ bảo trì và dễ debug khi có sự cố xảy ra.

10. Một số ví dụ thực tế

Quản lý tệp

Dưới đây là một ví dụ về quản lý tệp trong Python với xử lý lỗi để đảm bảo tệp được mở và đọc một cách an toàn.

try:
    # Mở tệp để đọc
    with open("test.txt", "r") as file:
        content = file.read()
    print(content)
except FileNotFoundError:
    print("Tệp không tồn tại!")
except PermissionError:
    print("Không có quyền truy cập vào tệp!")
except Exception as e:
    print(f"Đã xảy ra lỗi: {e}")

Quản lý tài khoản ngân hàng

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance

    def deposit(self, amount):
        try:
            if amount <= 0:
                raise ValueError("Số tiền gửi phải lớn hơn 0.")
            self.balance += amount
            print(f"Đã gửi {amount}. Số dư hiện tại là: {self.balance}")
        except ValueError as e:
            print(f"Lỗi: {e}")
    
    def withdraw(self, amount):
        try:
            if amount <= 0:
                raise ValueError("Số tiền rút phải lớn hơn 0.")
            if amount > self.balance:
                raise ValueError("Không đủ số dư để rút.")
            self.balance -= amount
            print(f"Đã rút {amount}. Số dư hiện tại là: {self.balance}")
        except ValueError as e:
            print(f"Lỗi: {e}")
    
    def check_balance(self):
        print(f"Số dư tài khoản của {self.owner} là: {self.balance}")


# Tạo tài khoản ngân hàng
account = BankAccount("Alice", 1000)

# Các hành động của người dùng
while True:
    print("\n1. Nạp tiền")
    print("2. Rút tiền")
    print("3. Kiểm tra số dư")
    print("4. Thoát")

    choice = input("Chọn hành động: ")

    if choice == "1":
        try:
            amount = float(input("Nhập số tiền muốn gửi: "))
            account.deposit(amount)
        except ValueError:
            print("Lỗi: Vui lòng nhập một số hợp lệ.")
    
    elif choice == "2":
        try:
            amount = float(input("Nhập số tiền muốn rút: "))
            account.withdraw(amount)
        except ValueError:
            print("Lỗi: Vui lòng nhập một số hợp lệ.")
    
    elif choice == "3":
        account.check_balance()
    
    elif choice == "4":
        print("Thoát chương trình.")
        break
    
    else:
        print("Lựa chọn không hợp lệ. Vui lòng chọn lại.")

Giải thích chương trình:

    Lớp BankAccount:
        Phương thức __init__ khởi tạo tài khoản với tên chủ sở hữu và số dư (mặc định là 0).
        Phương thức deposit dùng để nạp tiền vào tài khoản. Nếu số tiền nạp vào không hợp lệ (<= 0), chương trình sẽ raise một ngoại lệ ValueError để thông báo cho người dùng.
        Phương thức withdraw dùng để rút tiền từ tài khoản. Nó kiểm tra số tiền rút có hợp lệ hay không (số tiền phải lớn hơn 0 và không vượt quá số dư tài khoản).
        Phương thức check_balance in ra số dư hiện tại của tài khoản.

    Xử lý ngoại lệ:
        Trong phương thức deposit và withdraw, chúng ta sử dụng try-except để bắt các lỗi liên quan đến giá trị không hợp lệ như số tiền rút hoặc gửi không hợp lệ.
        Trong vòng lặp chính, khi người dùng nhập số tiền gửi hoặc rút, chúng ta kiểm tra xem người dùng có nhập đúng kiểu dữ liệu không (sử dụng float để chuyển đổi). Nếu không, chương trình sẽ bắt ngoại lệ ValueError và thông báo lỗi.

Tìm kiếm:

Quản lý lỗi (hay còn gọi là Xử lý ngoại lệ - Exception Handling) trong Python là một kỹ thuật quan trọng giúp bạn xử lý các tình huống bất ngờ mà chương trình có thể gặp phải trong quá trình thực thi, giúp chương trình không bị dừng đột ngột.