
Trong lập trình, lỗi (error) là điều không thể tránh khỏi. Nếu không xử lý tốt, chương trình có thể bị dừng đột ngột, gây ảnh hưởng đến trải nghiệm người dùng và hiệu suất hệ thống. Trong Python, exception handling là một cơ chế giúp phát hiện và xử lý lỗi một cách an toàn mà không làm gián đoạn toàn bộ chương trình.
1. Exception là gì?
Exception (ngoại lệ) là những lỗi xảy ra trong quá trình chạy chương trình. Chúng khác với lỗi cú pháp (syntax errors), vì lỗi cú pháp xảy ra ngay khi bạn viết mã sai, còn ngoại lệ chỉ xảy ra khi chương trình chạy.
Một số lỗi ngoại lệ phổ biến trong Python:
Ngoại lệ | Mô tả |
---|---|
ZeroDivisionError | Chia một số cho 0. |
ValueError | Kiểu dữ liệu không hợp lệ. |
FileNotFoundError | Không tìm thấy tệp tin. |
IndexError | Truy cập phần tử ngoài phạm vi danh sách. |
KeyError | Truy cập một khóa không tồn tại trong dictionary. |
TypeError | Sử dụng kiểu dữ liệu sai trong phép toán. |
Ví dụ lỗi khi chia một số cho 0:
print(10 / 0) # Lỗi ZeroDivisionError
Lỗi xảy ra ngay lập tức, khiến chương trình dừng hoạt động.
2. Xử lý ngoại lệ với try-except
Để tránh chương trình bị dừng, ta có thể sử dụng try-except
để bắt lỗi và xử lý chúng.
try:
print(10 / 0) # Thử thực hiện phép chia
except ZeroDivisionError:
print("Lỗi: Không thể chia một số cho 0!")
Khi có lỗi xảy ra, chương trình không bị crash, mà thay vào đó, except
sẽ được kích hoạt để xử lý lỗi.
Ví dụ bắt lỗi khi nhập sai dữ liệu:
try:
age = int(input("Nhập tuổi của bạn: ")) # Yêu cầu nhập số nguyên
print(f"Tuổi của bạn là {age}")
except ValueError:
print("Lỗi: Bạn phải nhập một số nguyên!")
Nếu người dùng nhập chữ thay vì số, ValueError
sẽ được bắt, và chương trình vẫn tiếp tục chạy bình thường.
3. Xử lý nhiều ngoại lệ với nhiều except
Python cho phép bạn xử lý nhiều loại lỗi khác nhau bằng cách dùng nhiều except
:
try:
x = int(input("Nhập một số: ")) # Người dùng nhập số
print(10 / x) # Thực hiện phép chia
except ZeroDivisionError:
print("Lỗi: Không thể chia một số cho 0!")
except ValueError:
print("Lỗi: Bạn phải nhập một số nguyên!")
Cách hoạt động:
- Nếu người dùng nhập
0
→ZeroDivisionError
. - Nếu người dùng nhập ký tự thay vì số →
ValueError
. - Nếu không có lỗi → Chương trình chạy bình thường.
4. Dùng else
và finally
Ngoài try-except
, Python còn có hai thành phần đặc biệt:
else
: Chạy khi không có lỗi xảy ra.finally
: Luôn chạy, dù có lỗi hay không.
Ví dụ:
try:
file = open("data.txt", "r") # Mở file
content = file.read()
print(content)
except FileNotFoundError:
print("Lỗi: Không tìm thấy tệp tin!")
else:
print("Tệp đọc thành công!") # Chỉ chạy nếu không có lỗi
finally:
print("Đóng tệp tin...") # Luôn chạy
file.close()
finally
đảm bảo tài nguyên luôn được giải phóng.
5. Tạo Exception tùy chỉnh với raise
Python cho phép bạn tạo lỗi tùy chỉnh bằng raise
, giúp kiểm soát lỗi theo logic riêng.
Ví dụ: Kiểm tra độ tuổi trước khi cho phép đăng ký:
def check_age(age):
if age < 18:
raise ValueError("Tuổi phải lớn hơn hoặc bằng 18!") # Tạo ngoại lệ tùy chỉnh
return "Hợp lệ!"
try:
print(check_age(15)) # Nhập tuổi <18
except ValueError as e:
print(f"Lỗi: {e}")
raise
giúp phát hiện lỗi sớm và ngăn nhập dữ liệu không hợp lệ.
6. Bắt mọi ngoại lệ bằng Exception
Nếu bạn muốn bắt tất cả loại lỗi, có thể dùng Exception
:
try:
x = int(input("Nhập số: "))
print(10 / x)
except Exception as e:
print(f"Lỗi xảy ra: {e}") # In ra lỗi cụ thể
Tuy nhiên, không nên lạm dụng vì có thể che giấu lỗi quan trọng.
7. Tóm tắt kiến thức quan trọng
- Dùng
try-except
để bắt lỗi và xử lý an toàn. - Sử dụng nhiều
except
để xử lý từng loại lỗi cụ thể. - Dùng
else
vàfinally
để kiểm soát luồng chương trình tốt hơn. - Dùng
raise
để tạo ngoại lệ tùy chỉnh, giúp kiểm tra dữ liệu đầu vào. - Bắt tất cả ngoại lệ với
Exception
, nhưng không nên lạm dụng.
Bạn đã từng gặp lỗi nào trong Python mà không biết cách xử lý chưa? Hãy chia sẻ để cùng thảo luận!