Mã lỗi là đầu mối, không phải lời giải tự động
Python thường cho biết dòng gây lỗi và tên ngoại lệ. Ví dụ `int("abc")` gây `ValueError` vì giá trị xâu không đổi được thành số nguyên; `[4, 7][2]` gây `IndexError` vì list dài 2 chỉ có chỉ số 0,1; `10 / 0` gây `ZeroDivisionError` vì mẫu số bằng 0. Tên ngoại lệ giúp khoanh vùng, nhưng vẫn phải kiểm dữ liệu và yêu cầu bài toán để sửa đúng.
`print(chua_co)` khi tên `chua_co` chưa được gán gây `NameError`. `[1,2][1.5]` gây `TypeError` vì chỉ số list không phải số nguyên hay slice. Nếu nhập hai số từ `input()`, cần kiểm dạng, số lượng và mẫu số trước khi đổi kiểu và chia; không thể chữa mọi lỗi chỉ bằng đổi tên biến.
Bài luyện
Với `A = [4, 7]`, lệnh `print(A[2])` phát sinh gì?
Giá trị phần tử không liên quan.
Chỉ số hợp lệ là 0,1; 2 vượt phạm vi.
A đã được gán.
7 ở chỉ số 1.
Lời giải
`len(A)=2`, chỉ số từ đầu là 0 và 1. Truy cập `A[2]` vượt giới hạn, Python báo `IndexError`.
Bài luyện
`print(chua_co)` khi chưa từng gán tên `chua_co` thường gây lỗi nào?
Python không tìm thấy tên này.
Không có phép chia.
Không có truy cập list.
Không có phép đổi giá trị.
Lời giải
Lệnh muốn đọc một tên chưa được định nghĩa, nên Python báo `NameError`.
Bài luyện
Với `A = [1, 2]`, lệnh `A[1.5]` thường gây lỗi nào?
1.5 sai kiểu chỉ số trước khi xét phạm vi.
Chỉ số list không dùng số thực 1.5.
Không có phép chia.
Python không chấp nhận chỉ số đó.
Lời giải
Chỉ số của list phải là số nguyên hoặc slice; 1.5 là số thực, nên lệnh gây `TypeError`.
Bài luyện
Trước khi thực hiện `m / n` với n do người dùng nhập, kiểm tra nào trực tiếp tránh ZeroDivisionError?
m lớn hơn n vẫn có thể n=0.
Mẫu số n phải khác 0.
Tử số 0 vẫn chia được nếu mẫu khác 0.
Hai số bằng nhau vẫn có thể đều 0.
Lời giải
Phép `m/n` chỉ tránh lỗi chia cho 0 khi mẫu số n khác 0; cần kiểm `n != 0` trước khi chia.
Đang học