1. Khởi động (Engagement)
Một chương trình hoàn chỉnh được mô tả như sau: Tiếp nhận các dữ liệu đầu vào, xử lí theo yêu cầu bài toán và đưa ra kết quả đúng theo yêu cầu.
💡 Câu hỏi suy ngẫm: Theo em nếu chương trình có lỗi, thì các lỗi này sẽ như thế nào và có thể ở đâu?
Trong thực tế, chương trình có thể gặp nhiều loại lỗi khác nhau ở các giai đoạn khác nhau: từ lúc viết code, lúc nhập dữ liệu, cho đến lúc xử lý và đưa ra kết quả. Hãy cùng tìm hiểu cách nhận biết và phân loại các loại lỗi này.
2. Hình thành kiến thức (Knowledge)
1. Nhận biết và phân biệt một số loại lỗi chương trình
Quan sát các trường hợp chương trình gặp lỗi sau, từ đó nhận biết và phân biệt một số loại lỗi của chương trình.
Trường hợp 1: Lỗi cú pháp (Syntax Error)
Người lập trình viết sai cú pháp lệnh, chương trình lập tức dừng lại và thông báo lỗi cú pháp.
Ví dụ:
Kết quả:
Nguyên nhân: Thiếu dấu hai chấm (:) sau while True
Trường hợp 2: Lỗi nhập dữ liệu (ValueError)
Người dùng nhập dữ liệu sai, chương trình thông báo lỗi nhập dữ liệu không đúng khuôn dạng.
Ví dụ:
Khi người dùng nhập: Nhập số nguyên n: 1.5
Kết quả:
Nguyên nhân: Không thể chuyển xâu "1.5" thành số nguyên
Trường hợp 3: Lỗi chỉ số vượt quá giới hạn (IndexError)
Chương trình thông báo lỗi chỉ số vượt quá giới hạn cho phép.
Ví dụ:
Kết quả:
Nguyên nhân: Danh sách A chỉ có 4 phần tử (chỉ số 0-3) nhưng vòng lặp chạy đến chỉ số 4
Trường hợp 4: Lỗi logic (Logic Error)
Chương trình thực hiện bình thường nhưng kết quả không đúng với yêu cầu của bài toán. Đây là lỗi logic bên trong chương trình.
Ví dụ: Tính tổng của ba số nguyên dương đầu tiên
Phân tích:
- Kết quả mong đợi: 1 + 2 + 3 = 6
- Kết quả thực tế: 0 + 1 + 2 = 3
- Nguyên nhân: range(3) tạo ra 0, 1, 2 thay vì 1, 2, 3
2. Phân loại lỗi
1. Lỗi cú pháp (Syntax Error):
- Vi phạm quy tắc viết code của ngôn ngữ lập trình
- Chương trình không thể chạy
- Ví dụ: thiếu dấu :, sai từ khóa, thụt lề sai
2. Lỗi ngoại lệ (Runtime Error):
- Cú pháp đúng nhưng xảy ra lỗi khi chạy
- Ví dụ: ValueError, IndexError, TypeError, ZeroDivisionError
3. Lỗi logic (Logic Error):
- Chương trình chạy bình thường nhưng kết quả sai
- Khó phát hiện nhất vì không có thông báo lỗi
- Cần kiểm tra kết quả với nhiều bộ dữ liệu
3. Luyện tập (Practice)
Bài tập thực hành
Bài tập 1: Nhận biết lỗi
Hãy xác định loại lỗi của các đoạn chương trình sau:
a) for i in range(5) print(i)
- Loại lỗi: Syntax Error
- Nguyên nhân: Thiếu dấu hai chấm (:) sau for
b) A = [1, 2, 3]; print(A[3])
- Loại lỗi: IndexError
- Nguyên nhân: Danh sách chỉ có chỉ số 0, 1, 2
c) x = "5"; y = 3; print(x + y)
- Loại lỗi: TypeError
- Nguyên nhân: Không thể cộng xâu với số
d) s = 0; for i in range(5): s = s + i; print(s) (mong đợi tính tổng 1+2+3+4+5)
- Loại lỗi: Logic Error
- Nguyên nhân: range(5) tạo ra 0,1,2,3,4 thay vì 1,2,3,4,5
Bài tập 2: Sửa lỗi cú pháp
Sửa các lỗi cú pháp trong đoạn chương trình sau:
Code có lỗi:
Code đã sửa:
Bài tập 3: Sửa lỗi logic
Đoạn chương trình sau tính tổng các số chẵn từ 1 đến n nhưng ra kết quả sai. Hãy tìm và sửa lỗi:
Code có lỗi:
Phân tích: range(n) tạo ra 0 đến n-1, nên tính cả số 0
Code đã sửa:
Bài tập 4: Xử lý lỗi nhập liệu
Viết chương trình nhập số nguyên dương, nếu người dùng nhập sai thì yêu cầu nhập lại.
Gợi ý:
4. Vận dụng (Application)
Bài tập vận dụng
Bài tập 1: Kiểm tra ngày tháng năm hợp lệ
Viết chương trình nhập ba số tự nhiên từ bàn phím day, month, year, các số cách nhau bởi dấu cách. Các số này biểu diễn giá trị của ngày, tháng, năm nào đó. Chương trình cần kiểm tra và in ra thông báo số liệu đã nhập vào đó có hợp lệ hay không.
Gợi ý:
Bài tập 2: Chương trình quản lý điểm với xử lý lỗi
Viết chương trình nhập điểm học sinh với các tính năng:
- Nhập điểm môn học (0-10)
- Kiểm tra điểm hợp lệ
- Tính điểm trung bình
- Xếp loại học lực
Gợi ý:
Bài tập 3: Gỡ lỗi chương trình tính UCLN, BCNN
Viết hàm có hai tham số đầu vào là m, n. Đầu ra trả lại hai giá trị là:
- UCLN của m, n
- Bội chung nhỏ nhất (BCNN) của m, n
Gợi ý: Sử dụng công thức UCLN(m, n) × BCNN(m, n) = m × n
Thảo luận:
- Tại sao việc xử lý lỗi lại quan trọng trong lập trình?
- Làm thế nào để chương trình của em "bền" hơn khi người dùng nhập dữ liệu?
- Khi nào nên dùng try...except và khi nào nên dùng if...else để kiểm tra?
Ghi nhớ kiến thức 🎯
- ✅ Syntax Error: Lỗi cú pháp, chương trình không chạy được.
- ✅ Runtime Error: Lỗi khi chạy, có thông báo rõ ràng.
- ✅ Logic Error: Lỗi logic, chương trình chạy nhưng kết quả sai.
- ✅ Dùng try...except để xử lý các lỗi ngoại lệ.
- ✅ Luôn kiểm tra dữ liệu đầu vào để tránh lỗi.
- ✅ Logic Error là loại lỗi nguy hiểm nhất cần kiểm thử kỹ.