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.
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.
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.
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}")
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
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}")
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}")
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ở
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}")
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.
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.
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}")
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.