Học đến đây rồi, bạn đã sẵn sàng bước vào một trong những kỹ năng quan trọng nhất trong lập trình: Xử lý lỗi. Không có phần mềm nào hoàn hảo – điều quan trọng là khi lỗi xảy ra, bạn xử lý nó thông minh, không để chương trình “văng” hoặc rơi vào trạng thái im lặng.
Viết code là để phục vụ con người, không chỉ máy tính
Dù bạn viết mã cẩn thận đến đâu, luôn có điều gì đó có thể sai:
- Người dùng nhập sai dữ liệu
- File không tồn tại
- Mạng bị ngắt khi đang kết nối
- Chia cho 0
Chính vì vậy, một lập trình viên giỏi không chỉ biết viết code chạy đúng – mà còn viết code xử lý khi mọi thứ… sai.
Python cung cấp một công cụ cực kỳ mạnh và dễ hiểu để bắt lỗi: try – except
.
Mục tiêu bài học
- Biết cách dùng
try – except
để bắt lỗi cơ bản - Biết phân biệt các loại lỗi thường gặp
- Biết dùng
finally
để luôn thực hiện hành động (dù lỗi hay không) - Có thể hiển thị thông báo, ghi log, hoặc dừng nhẹ nhàng khi lỗi xảy ra
1. Cú pháp cơ bản
try:
# đoạn mã có nguy cơ gây lỗi
except:
# xử lý khi lỗi xảy ra
Ví dụ:
try:
a = int(input("Nhập số: "))
b = 10 / a
print(b)
except:
print("Có lỗi xảy ra! Bạn nhập gì thế?")
2. Bắt lỗi cụ thể
Bạn có thể chỉ bắt lỗi mà bạn muốn xử lý, giúp tránh bắt nhầm lỗi hoặc che giấu bug.
try:
x = int("abc")
except ValueError:
print("Không thể chuyển chuỗi sang số nguyên.")
Một số lỗi thường gặp:
Lỗi | Khi nào xảy ra |
---|---|
ValueError | Khi chuyển dữ liệu không hợp lệ |
ZeroDivisionError | Khi chia cho 0 |
FileNotFoundError | Khi mở file không tồn tại |
TypeError | Khi kiểu dữ liệu không đúng |
IndexError | Khi truy cập vị trí không tồn tại trong list |
3. else
và finally
else
: chạy nếu không có lỗi
try:
print("Không lỗi")
except:
print("Lỗi")
else:
print("Chạy nếu không có lỗi")
finally
: luôn luôn chạy
Dùng để dọn dẹp tài nguyên, đóng file, ghi log…
try:
f = open("abc.txt")
except:
print("Không mở được file")
finally:
print("Đã thử xong, đóng tài nguyên nếu có")
4. Bắt nhiều loại lỗi
try:
x = int(input("Nhập số: "))
y = 10 / x
except ValueError:
print("Không đúng định dạng số.")
except ZeroDivisionError:
print("Không được chia cho 0.")
5. Dùng raise
để chủ động báo lỗi
Bạn có thể tự kiểm tra điều kiện và chủ động ném lỗi:
x = -5
if x < 0:
raise ValueError("Giá trị phải lớn hơn 0")
6. Ứng dụng thực tế: nhập lại nếu sai
while True:
try:
a = int(input("Nhập số nguyên dương: "))
if a <= 0:
raise ValueError
break
except:
print("Nhập sai! Vui lòng thử lại.")
print("Bạn đã nhập:", a)
7. Bài tập luyện tập
Bài 1: Nhập một số, in nghịch đảo (1/x
). Bắt lỗi chia cho 0 hoặc không phải số.
Bài 2: Mở file tên dulieu.txt
. Nếu file không tồn tại, in ra thông báo.
Bài 3: Viết hàm nhận vào danh sách, trả về phần tử ở vị trí n
. Nếu n
sai, bắt lỗi IndexError
.
Bài 4: Viết chương trình yêu cầu nhập tuổi, nếu nhập sai định dạng hoặc âm, yêu cầu nhập lại.
Bài 5: Ghi log lỗi vào file error_log.txt
khi lỗi xảy ra (dùng with open(...)
trong except
)
Kết luận
Không có chương trình nào hoàn hảo. Nhưng một chương trình chuyên nghiệp sẽ không bao giờ chết bất ngờ, mà thông báo tử tế, xử lý nhẹ nhàng, và nếu cần, ghi lại lỗi để bạn có thể sửa sau.
try – except
là kỹ năng bắt buộc để:
- Làm việc với người dùng
- Đọc ghi file
- Kết nối mạng
- Viết ứng dụng GUI
Bài tiếp theo: Bài 18 – Class và Object: Lập trình hướng đối tượng cơ bản
Chúng ta sẽ bước vào một cấp độ mới: tạo ra kiểu dữ liệu riêng của chính bạn với thuộc tính, hành vi, và mối quan hệ – đây là gốc rễ của lập trình hiện đại.
Thảo luận