🐛 Lỗi thường gặp và cách đọc lỗi
← Quay lại Bắt đầu
Cách dùng file này
- Gặp lỗi → tìm tên lỗi ở mục lục bên dưới
- Đọc dòng cuối cùng của traceback trước — đó là tên và mô tả lỗi
- Sau khi tự sửa được một lỗi mới, ghi thêm vào mục “Nhật ký lỗi của tôi” ở cuối file
0. Quy trình đọc lỗi
graph TD A[Gặp lỗi] --> B[Đọc DÒNG CUỐI CÙNG] B --> C{Nhận ra tên lỗi?} C -->|Có| D[Tra bảng bên dưới] C -->|Không| E[Đọc từ DƯỚI lên: file nào, dòng nào] E --> F[Mở file, xem dòng đó] D --> G[Sửa] F --> G G --> H{Hết lỗi?} H -->|Không| A H -->|Có| I[Ghi vào nhật ký lỗi]
Cấu trúc một traceback
Traceback (most recent call last): <- Bắt đầu
File "main.py", line 12, in <module> <- Lời gọi ngoài cùng
ket_qua = tinh_tong(du_lieu)
File "main.py", line 5, in tinh_tong <- Nơi lỗi THẬT SỰ xảy ra
return sum(ds) / len(ds)
~~~~~~~~^~~~~~~~~
ZeroDivisionError: division by zero <- ⭐ ĐỌC DÒNG NÀY TRƯỚC
| Phần | Ý nghĩa |
|---|---|
| Dòng cuối | Tên lỗi và mô tả — 90% thông tin nằm ở đây |
| Khung cuối cùng (gần dòng lỗi nhất) | File và dòng gây lỗi thật sự |
| Các khung phía trên | Chuỗi lời gọi dẫn tới đó |
Ký hiệu ~~~^~~~ | Python chỉ chính xác vị trí gây lỗi trên dòng |
1. Lỗi cú pháp (Syntax Errors)
Lỗi xảy ra trước khi chạy. Chương trình không chạy dòng nào.
SyntaxError: '(' was never closed
print("Xin chao"Nguyên nhân: Thiếu dấu ngoặc đóng.
Sửa: Đếm lại số ngoặc mở/đóng. VS Code tô màu ngoặc theo cặp — dùng nó.
SyntaxError: invalid syntax
Lỗi chung chung nhất. Các nguyên nhân thường gặp:
if x = 5: # ❌ Dùng = thay vì ==
if x == 5 # ❌ Thiếu dấu :
class = "Ke toan" # ❌ Dùng từ khóa làm tên biến
print "abc" # ❌ Cú pháp Python 2
def ham(a b): # ❌ Thiếu dấu phẩy giữa tham sốMẹo
Python thường báo lỗi ở dòng SAU dòng thực sự sai. Nếu dòng được báo trông ổn, hãy kiểm tra dòng phía trên.
IndentationError: expected an indented block
if x > 5:
print("abc") # ❌ Không thụt lề sau if:Sửa: Thụt vào 4 dấu cách.
IndentationError: unexpected indent
print("A")
print("B") # ❌ Thụt lề khi không cầnIndentationError: unindent does not match any outer indentation level
if x > 5:
print("A")
print("B") # ❌ Thụt 3 space, không khớp mức nàoTabError: inconsistent use of tabs and spaces in indentation
Trộn lẫn Tab và Space. Mắt thường không thấy được.
Sửa:
- VS Code →
Ctrl + ,→ bậtEditor: Render Whitespace = all - Bật
Editor: Insert Spaces = true - VS Code →
Ctrl + Shift + P→Convert Indentation to Spaces
→ 02 - Chương trình đầu tiên và cú pháp nền tảng
2. Lỗi tên (Name Errors)
NameError: name 'x' is not defined
| Nguyên nhân | Ví dụ | Sửa |
|---|---|---|
| Gõ sai tên biến | so_luong vs soluong | Kiểm tra chính tả |
| Sai chữ hoa/thường | Print() vs print() | Python phân biệt hoa thường |
| Dùng biến trước khi gán | print(x) rồi mới x = 1 | Đảo thứ tự |
| Gọi hàm trước khi định nghĩa | f() rồi mới def f() | Định nghĩa trước |
| Biến cục bộ dùng ngoài hàm | Trả về bằng return | |
| Quên nháy kép quanh chuỗi | print(abc) | print("abc") |
print("Xin chao") # ✅
Print("Xin chao") # ❌ NameError: name 'Print' is not definedUnboundLocalError: cannot access local variable 'x'
x = 10
def f():
print(x) # ❌ UnboundLocalError
x = 20 # Vì có dòng này, Python coi x là biến CỤC BỘ
f()Sửa: Truyền x vào hàm qua tham số, hoặc dùng tên biến khác.
3. Lỗi kiểu (Type Errors)
TypeError: can only concatenate str (not "int") to str
tuoi = 25
print("Tuoi: " + tuoi) # ❌
print("Tuoi: " + str(tuoi)) # ✅
print(f"Tuoi: {tuoi}") # ✅ Tốt nhấtTypeError: unsupported operand type(s) for +: 'int' and 'str'
tuoi = input("Tuoi: ") # input LUÔN trả về CHUỖI
print(tuoi + 1) # ❌
print(int(tuoi) + 1) # ✅Lỗi số 1 của người mới
input()luôn trả về chuỗi. Phải ép kiểu ngay:int(input(...))hoặcfloat(input(...)).
TypeError: 'str' object does not support item assignment
s = "abc"
s[0] = "X" # ❌ Chuỗi là immutable
s = "X" + s[1:] # ✅TypeError: 'int' object is not iterable
for x in 5: # ❌ Số không lặp được
for x in range(5): # ✅TypeError: 'NoneType' object is not subscriptable/iterable
ds = [3, 1, 2].sort() # sort() trả về None!
print(ds[0]) # ❌ TypeError
ds = [3, 1, 2]
ds.sort() # ✅ Sửa tại chỗ
# hoặc
ds = sorted([3, 1, 2]) # ✅Nguyên nhân chung: hàm bạn gọi trả về None. Kiểm tra xem hàm có return không.
TypeError: f() missing 1 required positional argument: 'b'
def f(a, b): ...
f(1) # ❌ Thiếu đối số
f(1, 2) # ✅TypeError: 'str' object is not callable
print = "xin chao" # Vô tình ghi đè hàm print
print("abc") # ❌ TypeErrorSửa: Đổi tên biến. Không đặt tên biến trùng hàm có sẵn (list, dict, str, type, sum, print, id, input, max, min).
TypeError: unhashable type: 'list'
d = {[1, 2]: "x"} # ❌ List không làm khóa được
d = {(1, 2): "x"} # ✅ Tuple thì được
s = {[1, 2]} # ❌ Set không chứa list được4. Lỗi giá trị (Value Errors)
ValueError: invalid literal for int() with base 10: 'abc'
int("abc") # ❌
int("10.5") # ❌ int() không nhận dấu chấm
int("") # ❌
int(" 10 ") # ✅ Chấp nhận khoảng trắng 2 đầu
int(float("10.5")) # ✅ Qua float trướcCách xử lý an toàn:
nhap = input("Nhap so: ").strip()
try:
so = int(nhap)
except ValueError:
print("Vui long nhap so nguyen")ValueError: list.remove(x): x not in list
ds = [1, 2, 3]
ds.remove(99) # ❌
if 99 in ds: # ✅
ds.remove(99)ValueError: not enough values to unpack (expected 3, got 2)
a, b, c = (1, 2) # ❌ Số biến không khớp
a, b = (1, 2) # ✅
a, *rest = (1, 2) # ✅ Gom phần dưValueError: too many values to unpack
a, b = (1, 2, 3) # ❌5. Lỗi truy cập (Index / Key Errors)
IndexError: list index out of range
ds = [1, 2, 3]
ds[3] # ❌ Chỉ số hợp lệ: 0, 1, 2
ds[-1] # ✅ Phần tử cuối
ds[len(ds) - 1] # ✅Nguyên nhân phổ biến: quên rằng chỉ số bắt đầu từ 0, không phải 1 (khác SQL).
# ✅ Cách an toàn
if len(ds) > 3:
print(ds[3])
# ✅ Slicing không bao giờ lỗi
print(ds[3:4]) # [] nếu không cóKeyError: 'ten_khoa'
d = {"a": 1}
d["b"] # ❌ KeyError
d.get("b") # ✅ None
d.get("b", 0) # ✅ Giá trị mặc định
if "b" in d: # ✅
print(d["b"])6. Lỗi thuộc tính (Attribute Errors)
AttributeError: 'str' object has no attribute 'append'
s = "abc"
s.append("d") # ❌ Chuỗi không có append
ds = ["a", "b"]
ds.append("c") # ✅ List thì cóNguyên nhân: dùng nhầm method của kiểu này cho kiểu khác. Kiểm tra bằng type(x).
AttributeError: 'NoneType' object has no attribute 'X'
kq = tim_kiem("KH999") # Hàm trả về None khi không tìm thấy
print(kq.ten) # ❌ AttributeError
if kq is not None: # ✅
print(kq.ten)AttributeError: module 'X' has no attribute 'Y'
| Nguyên nhân | Sửa |
|---|---|
| Gõ sai tên hàm | math.sqr() → math.sqrt() |
| File của bạn trùng tên module | Đổi tên file math.py của bạn |
Còn file __pycache__ cũ | Xóa thư mục __pycache__ |
Đừng đặt tên file trùng module
Đặt file
random.py,json.py,csv.py,datetime.pysẽ khiếnimport randomnạp file của bạn thay vì thư viện chuẩn. Lỗi này rất khó chẩn đoán.
7. Lỗi số học
ZeroDivisionError: division by zero
10 / 0 # ❌
10 // 0 # ❌
10 % 0 # ❌
# ✅ Kiểm tra trước
if b != 0:
print(a / b)
# ✅ Short-circuit
print(b != 0 and a / b)
# ✅ Toán tử ba ngôi
kq = a / b if b != 0 else 0Kết quả sai với float
0.1 + 0.2 == 0.3 # False !!!
round(2.5) # 2, không phải 3 (banker's rounding)Không phải “lỗi” mà là đặc điểm của số thực. Với tiền tệ, dùng Decimal.
8. Lỗi file
FileNotFoundError: [Errno 2] No such file or directory: 'f.txt'
| Nguyên nhân | Sửa |
|---|---|
| Sai tên file | Kiểm tra chính tả, phần mở rộng |
| Sai đường dẫn | Dùng đường dẫn tuyệt đối để thử |
| Đang đứng sai thư mục | import os; print(os.getcwd()) |
| Windows ẩn phần mở rộng | File thực tế là f.txt.txt |
from pathlib import Path
p = Path("f.txt")
print(p.resolve()) # Xem đường dẫn tuyệt đối Python đang tìm
print(p.exists())PermissionError: [Errno 13] Permission denied
| Nguyên nhân | Sửa |
|---|---|
| File đang mở bằng Excel/Word | Đóng file lại |
| Đường dẫn là thư mục, không phải file | Kiểm tra p.is_file() |
| File chỉ đọc | Bỏ thuộc tính read-only |
Ghi vào C:\ hoặc Program Files | Chọn thư mục khác |
UnicodeDecodeError: 'charmap' codec can't decode byte...
open("f.txt") # ❌ Dùng encoding mặc định
open("f.txt", encoding="utf-8") # ✅
open("f.csv", encoding="utf-8-sig") # ✅ File từ Excel
open("f.txt", encoding="utf-8", errors="replace") # Cứu hộChữ tiếng Việt bị lỗi (không báo lỗi nhưng hiển thị sai)
Nguy?n V?n A -> Sai encoding khi đọc
Nguyên Văn A -> Đọc UTF-8 bằng cp1252
Sửa: chỉ định đúng encoding. Thử lần lượt utf-8, utf-8-sig, cp1258.
File CSV ghi ra có dòng trống xen kẽ
open("f.csv", "w", encoding="utf-8-sig") # ❌ Thiếu newline
open("f.csv", "w", newline="", encoding="utf-8-sig") # ✅9. Lỗi import
ModuleNotFoundError: No module named 'X'
| Nguyên nhân | Sửa |
|---|---|
| Chưa cài thư viện | pip install X |
| Quên kích hoạt môi trường ảo | .venv\Scripts\activate |
| Cài vào Python khác | Dùng python -m pip install X |
| Gõ sai tên | Tên cài khác tên import (ví dụ: cài python-dotenv, import dotenv) |
File cùng thư mục nhưng chưa __init__.py | Thêm file __init__.py |
python -m pip list # Xem đã cài gì
where python # Xem đang dùng Python nàoImportError: cannot import name 'X' from 'Y'
Module tồn tại nhưng không có tên đó. Kiểm tra:
import Y
print(dir(Y)) # Liệt kê mọi tên trong moduleImport vòng (circular import)
ImportError: cannot import name 'X' from partially initialized module
File A import B, B lại import A. Sửa: tách phần dùng chung ra module thứ ba.
→ 12 - Module, Package và Thư viện chuẩn | 15 - Môi trường ảo và pip
10. Lỗi môi trường (không phải lỗi Python)
'python' is not recognized as an internal or external command
Nguyên nhân: Python chưa vào PATH.
Sửa:
- Cài lại Python, tích ô
Add python.exe to PATH - Hoặc dùng lệnh
pythay chopython - Hoặc thêm thủ công vào PATH → 01 - Cài đặt môi trường
Gõ python mở Microsoft Store
Sửa: Settings → Apps → Advanced app settings → App execution aliases → tắt python.exe và python3.exe.
'pip' is not recognized
python -m pip install ten_goi # ✅ Luôn hoạt độngPowerShell: cannot be loaded because running scripts is disabled
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSignedHoặc đơn giản: dùng Command Prompt (cmd) thay vì PowerShell.
11. Lỗi database
sqlite3.OperationalError: no such table: X
| Nguyên nhân | Sửa |
|---|---|
Chưa chạy CREATE TABLE | Chạy hàm khởi tạo |
Kết nối nhầm file .db | Kiểm tra đường dẫn |
| Sai chữ hoa/thường tên bảng | SQLite phân biệt hoa thường với tên bảng |
sqlite3.IntegrityError: UNIQUE constraint failed
Chèn bản ghi trùng khóa chính. Xử lý:
try:
cur.execute("INSERT INTO T (Ma) VALUES (?)", (ma,))
except sqlite3.IntegrityError:
print(f"Ma '{ma}' da ton tai")sqlite3.ProgrammingError: Incorrect number of bindings supplied
cur.execute("... WHERE Ma = ?", (ma)) # ❌ Đây là chuỗi, không phải tuple
cur.execute("... WHERE Ma = ?", (ma,)) # ✅ Chú ý dấu phẩy
cur.execute("... WHERE Ma = ?", [ma]) # ✅ List cũng đượcDữ liệu không được lưu
Nguyên nhân: quên conn.commit() sau INSERT/UPDATE/DELETE.
cur.execute("INSERT ...")
conn.commit() # ⚠️ BẮT BUỘCsqlite3.OperationalError: database is locked
Có kết nối khác đang giữ database. Đóng mọi kết nối, đóng công cụ như DB Browser for SQLite.
→ 16 - Python kết nối Database
12. Lỗi logic (chương trình chạy nhưng kết quả sai)
Loại lỗi khó nhất — Python không báo gì, nhưng kết quả không đúng.
| Triệu chứng | Nguyên nhân thường gặp |
|---|---|
| Vòng lặp chạy thiếu 1 lần | range(1, n) thay vì range(1, n+1) |
| Slicing thiếu phần tử cuối | Quên stop không được lấy |
if/elif luôn vào nhánh đầu | Thứ tự điều kiện sai (đi từ lỏng đến chặt) |
| Sửa list này thì list kia đổi theo | b = a không tạo bản sao |
Hàm trả về None | Quên return |
| Tổng tiền lệch vài đồng | Dùng float thay vì Decimal |
| Giá trị mặc định “nhớ” lần gọi trước | Mutable default argument |
| So sánh chuỗi số sai | "10" < "9" là True |
Điều kiện if so_luong: sai khi bằng 0 | 0 là falsy |
| Chương trình treo | while thiếu cập nhật biến điều khiển |
Kỹ thuật gỡ lỗi logic
1. print() debug
print(f"{bien=}") # bien=42
print(f"{type(x)=}, {len(ds)=}")2. Debugger của VS Code (hiệu quả nhất)
- Bấm vào lề trái số dòng để đặt breakpoint (điểm dừng)
- Nhấn
F5để chạy debug F10— chạy từng dòng |F11— bước vào hàm |F5— chạy tiếp- Panel bên trái hiển thị giá trị mọi biến tại thời điểm đó
3. Thu hẹp phạm vi
Comment bớt code, chạy từng phần nhỏ để xác định đoạn nào sai.
4. Kiểm tra với dữ liệu đơn giản
Thay dữ liệu thật bằng dữ liệu nhỏ mà bạn tự tính được kết quả bằng tay.
13. Bảng tra nhanh
| Thông báo lỗi | Nguyên nhân số 1 |
|---|---|
SyntaxError: invalid syntax | Thiếu dấu : hoặc dùng = thay == |
IndentationError | Thụt lề sai |
TabError | Trộn Tab và Space |
NameError | Gõ sai tên hoặc sai hoa/thường |
TypeError: can only concatenate str | Quên str() hoặc dùng f-string |
TypeError: unsupported operand +: int and str | Quên ép kiểu input() |
TypeError: 'NoneType' is not subscriptable | Hàm trả về None |
ValueError: invalid literal for int() | Ép kiểu chuỗi không phải số |
IndexError: list index out of range | Chỉ số vượt giới hạn |
KeyError | Khóa không có trong dict → dùng .get() |
AttributeError: 'NoneType' | Đối tượng là None |
ZeroDivisionError | Chia cho 0 |
FileNotFoundError | Sai đường dẫn hoặc sai thư mục hiện tại |
UnicodeDecodeError | Thiếu encoding="utf-8" |
ModuleNotFoundError | Chưa pip install hoặc quên activate venv |
'python' is not recognized | Chưa vào PATH |
14. 📓 Nhật ký lỗi của tôi
Đây là phần quan trọng nhất
Mỗi khi gặp một lỗi mới và tự sửa được, ghi vào bảng dưới. Sau 6 tháng, đây sẽ là tài liệu quý giá nhất trong notebook của bạn — vì nó ghi lại đúng những lỗi bạn hay mắc.
| Ngày | Tên lỗi | Thông báo đầy đủ | Nguyên nhân | Cách sửa | Module |
|---|---|---|---|---|---|