🐛 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

  1. Gặp lỗi → tìm tên lỗi ở mục lục bên dưới
  2. Đọc dòng cuối cùng của traceback trước — đó là tên và mô tả lỗi
  3. 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ốiTê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ênChuỗ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ần

IndentationError: 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ào

TabError: 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:

  1. VS Code → Ctrl + , → bật Editor: Render Whitespace = all
  2. Bật Editor: Insert Spaces = true
  3. 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ânVí dụSửa
Gõ sai tên biếnso_luong vs soluongKiểm tra chính tả
Sai chữ hoa/thườngPrint() vs print()Python phân biệt hoa thường
Dùng biến trước khi gánprint(x) rồi mới x = 1Đảo thứ tự
Gọi hàm trước khi định nghĩaf() rồi mới def f()Định nghĩa trước
Biến cục bộ dùng ngoài hàmTrả về bằng return
Quên nháy kép quanh chuỗiprint(abc)print("abc")
print("Xin chao")       # ✅
Print("Xin chao")       # ❌ NameError: name 'Print' is not defined

UnboundLocalError: 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.

→ 10 - Hàm (Function)


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ất

TypeError: 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ặc float(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")            # ❌ TypeError

Sử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 được

→ 03 - Biến và kiểu dữ liệu


4. 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ước

Cá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"])

→ 09 - Dict và Set


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ânSửa
Gõ sai tên hàmmath.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.py sẽ khiến import random nạ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 0

Kế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.

→ 03 - Biến và kiểu dữ liệu


8. Lỗi file

FileNotFoundError: [Errno 2] No such file or directory: 'f.txt'

Nguyên nhânSửa
Sai tên fileKiểm tra chính tả, phần mở rộng
Sai đường dẫnDùng đường dẫn tuyệt đối để thử
Đang đứng sai thư mụcimport os; print(os.getcwd())
Windows ẩn phần mở rộngFile 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ânSửa
File đang mở bằng Excel/WordĐóng file lại
Đường dẫn là thư mục, không phải fileKiểm tra p.is_file()
File chỉ đọcBỏ thuộc tính read-only
Ghi vào C:\ hoặc Program FilesChọ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")    # ✅

→ 13 - Làm việc với File


9. Lỗi import

ModuleNotFoundError: No module named 'X'

Nguyên nhânSửa
Chưa cài thư việnpip install X
Quên kích hoạt môi trường ảo.venv\Scripts\activate
Cài vào Python khácDùng python -m pip install X
Gõ sai tênTê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__.pyThêm file __init__.py
python -m pip list          # Xem đã cài gì
where python                # Xem đang dùng Python nào

ImportError: 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 module

Import 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:

  1. Cài lại Python, tích ô Add python.exe to PATH
  2. Hoặc dùng lệnh py thay cho python
  3. 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 động

PowerShell: cannot be loaded because running scripts is disabled

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

Hoặ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ânSửa
Chưa chạy CREATE TABLEChạy hàm khởi tạo
Kết nối nhầm file .dbKiểm tra đường dẫn
Sai chữ hoa/thường tên bảngSQLite 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 được

Dữ 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ỘC

sqlite3.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ứngNguyên nhân thường gặp
Vòng lặp chạy thiếu 1 lầnrange(1, n) thay vì range(1, n+1)
Slicing thiếu phần tử cuốiQuên stop không được lấy
if/elif luôn vào nhánh đầuThứ tự điều kiện sai (đi từ lỏng đến chặt)
Sửa list này thì list kia đổi theob = a không tạo bản sao
Hàm trả về NoneQuên return
Tổng tiền lệch vài đồngDùng float thay vì Decimal
Giá trị mặc định “nhớ” lần gọi trướcMutable default argument
So sánh chuỗi số sai"10" < "9" là True
Điều kiện if so_luong: sai khi bằng 00 là falsy
Chương trình treowhile 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ỗiNguyên nhân số 1
SyntaxError: invalid syntaxThiếu dấu : hoặc dùng = thay ==
IndentationErrorThụt lề sai
TabErrorTrộn Tab và Space
NameErrorGõ sai tên hoặc sai hoa/thường
TypeError: can only concatenate strQuên str() hoặc dùng f-string
TypeError: unsupported operand +: int and strQuên ép kiểu input()
TypeError: 'NoneType' is not subscriptableHàm trả về None
ValueError: invalid literal for int()Ép kiểu chuỗi không phải số
IndexError: list index out of rangeChỉ số vượt giới hạn
KeyErrorKhóa không có trong dict → dùng .get()
AttributeError: 'NoneType'Đối tượng là None
ZeroDivisionErrorChia cho 0
FileNotFoundErrorSai đường dẫn hoặc sai thư mục hiện tại
UnicodeDecodeErrorThiếu encoding="utf-8"
ModuleNotFoundErrorChưa pip install hoặc quên activate venv
'python' is not recognizedChư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àyTên lỗiThông báo đầy đủNguyên nhânCách sửaModule

Liên kết