Ba cách lỗi bộc lộ
Viết `if n > 0 print(n)` thiếu dấu `:` và cấu trúc đúng sẽ gây `SyntaxError`: Python không thực hiện được mã sai cú pháp. Với `n = int("1.5")`, cú pháp hợp lệ nhưng lúc chạy phép đổi này gây `ValueError`. Hai trường hợp đều dừng nếu không có xử lí thích hợp, nhưng nguyên nhân khác nhau.
Lỗi lôgic khó thấy hơn: chương trình vẫn chạy, song kết quả không đúng yêu cầu. Nếu cần tính tổng 1+2+3 mà viết `sum(range(3))`, kết quả là 3 vì `range(3)` cho 0,1,2; kết quả đúng phải là 6. Muốn phát hiện, cần có đầu ra mong đợi để so sánh. Trong bài này, “ngoại lệ” dùng cho lỗi phát sinh khi chạy một lệnh hợp lệ về cú pháp, không gọi mọi lỗi là lỗi lôgic.
Bài luyện
`n = int("1.5")` hợp cú pháp nhưng khi chạy dừng. Đây là loại lỗi nào?
Cú pháp lời gọi đúng.
Xâu 1.5 không đổi thẳng bằng int được.
Python báo ngoại lệ, không chạy đến kết quả sai âm thầm.
Lệnh dừng.
Lời giải
`int("1.5")` không chuyển được xâu thập phân thành số nguyên theo cách này, nên khi chạy phát sinh `ValueError`.
Bài luyện
Nếu chương trình tính tổng 1+2+3 bằng `sum(range(3))` và in 3, lỗi chính là gì?
Mã hợp cú pháp.
Không có phép đổi dữ liệu sai.
Chạy được nhưng kết quả 3 sai yêu cầu 6.
Không truy cập danh sách.
Lời giải
`range(3)` tạo 0,1,2 nên tổng là 3. Chương trình chạy được nhưng không tính đúng 1+2+3=6; đó là lỗi lôgic.
Bài luyện
Dòng `if n > 0 print(n)` thiếu phần nào để mở khối lệnh đúng?
Cú pháp if cần `:` và thân ở dòng thụt vào.
Không dùng list.
Không cần đổi kiểu trong dòng này.
Không có list.
Lời giải
Cú pháp đúng gồm `if n > 0:` rồi dòng `print(n)` thụt vào. Dòng đã cho sai cấu trúc nên gây `SyntaxError`.
Đang học