Error Python terbagi ke dalam tiga kategori berbeda - sintaks, runtime, dan logika - dan alat yang tepat untuk masing-masing pun berbeda. Pemeriksa sintaks menangkap masalah struktural sebelum interpreter menjalankan satu baris pun; penjelas traceback mendekode rantai panggilan setelah exception muncul; analisis statis seperti Flake8 atau mypy menemukan bug yang tak terlihat oleh kedua pendekatan itu. Panduan ini memetakan setiap kategori error Python ke alat terbaik untuk menangkapnya, dengan alur kerja untuk pengembangan lokal, editor, dan CI/CD.
Jenis-jenis error Python
Setiap error Python termasuk dalam salah satu dari tiga kategori, dan mengetahui kategori mana yang Anda hadapi langsung memberi tahu alat mana yang harus digunakan. Mencampuradukkannya membuat Anda menghabiskan sepuluh menit menjalankan pemeriksa sintaks untuk masalah runtime, atau memasang pemeriksa tipe untuk mengatasi kesalahan indentasi murni. Kategori-kategori ini berbeda pada level interpreter - masing-masing muncul pada tahap eksekusi yang berbeda.
Error sintaks dan error indentasi
Python melempar `SyntaxError` atau `IndentationError` saat parsing - sebelum satu byte bytecode pun dihasilkan. Interpreter membaca file sumber, membangun abstract syntax tree, dan langsung berhenti jika strukturnya melanggar tata bahasa Python. Pemicu umum: titik dua hilang setelah `def`, `class`, `if`, atau `for`; tanda kurung atau kurung siku tak tertutup; mencampur tab dan spasi dalam blok yang sama; atau menggunakan kata kunci tercadang sebagai nama variabel. Pesan error menyertakan nama file, nomor baris, dan caret yang menunjuk token yang tidak diharapkan.
Exception runtime
Exception runtime dilempar selama eksekusi ketika kode yang secara sintaks valid mencoba operasi ilegal. Yang paling umum: `TypeError` (memanggil sesuatu yang tidak dapat dipanggil, meneruskan tipe argumen yang salah), `AttributeError` (mengakses metode atau atribut yang tidak ada pada objek), `NameError` (merujuk variabel yang belum pernah diassign), `KeyError` (mengakses kunci dict yang tidak ada), dan `IndexError` (merujuk posisi list di luar rentang). Menangkapnya memerlukan lingkungan yang berjalan, stack trace, atau analisis statis yang cermat.
Error logika
Error logika menghasilkan keluaran yang salah tanpa melempar exception apa pun. Off-by-one pada sebuah range, argumen default yang mutable menumpuk state antar panggilan, salinan dangkal di tempat yang seharusnya salinan mendalam - semua itu tak terlihat oleh pemeriksa sintaks mana pun dan kebanyakan analisis statis. Error ini hanya ditemukan dengan menjalankan kode pada data uji yang representatif, menulis unit test, atau meninjau logikanya secara manual.
- SyntaxError: Struktur buruk - titik dua hilang, kurung tak tertutup, token tidak valid. Tertangkap saat parsing.
- IndentationError: Whitespace tidak konsisten - tab dan spasi bercampur, atau blok terindentasi ke level yang mustahil.
- TypeError: Tipe salah - meneruskan string di tempat angka diharapkan, memanggil sebuah integer.
- NameError: Nama tak terdefinisi - merujuk variabel sebelum diassign atau salah eja nama fungsi.
- AttributeError: Atribut hilang - memanggil `.split()` pada sebuah integer, mengakses atribut yang sudah dihapus.
- Bug logika: Keluaran salah, tanpa exception - memerlukan tes, debugger, atau tinjauan manual yang cermat.
Note
Pemeriksa sintaks Python
Pemeriksa sintaks Python memvalidasi struktur kode Anda tanpa menjalankannya dan melaporkan setiap tempat kode sumber melanggar tata bahasa Python. Ini pemeriksaan pertama yang tercepat dan paling aman - hasil dalam milidetik, tanpa efek samping, dan tanpa bergantung pada lingkungan Python yang berfungsi yang dikonfigurasi secara lokal.
Kapan menggunakan pemeriksa sintaks
Pemeriksa sintaks membawa manfaat dalam empat situasi: ketika Anda menerima Python dari pihak ketiga (kode hasil generate, cuplikan dari dokumentasi, file dari kolega), ketika Anda menulis Python di editor tanpa dukungan language server, ketika Anda butuh pemeriksaan cepat pada skrip yang banyak diedit sebelum commit, dan ketika Anda men-debug skrip yang gagal memulai tanpa keluaran yang membantu di terminal.
Pemeriksaan sintaks bawaan dengan py_compile
Python dilengkapi pemeriksa sintaks bawaan yang tidak memerlukan instalasi tambahan. Jalankan `python -m py_compile yourfile.py` - jika perintah selesai dalam senyap, sintaksnya valid. Jika ada masalah, perintah mencetak nama file, nomor baris, dan jenis error. Untuk memeriksa banyak file sekaligus, `python -m compileall src/` menelusuri pohon direktori dan melaporkan setiap error sintaks yang ditemukan.
# Check a single file - exits silently if valid
python -m py_compile myscript.py
# Check all .py files in a directory tree
python -m compileall src/
# Verbose output - shows each file checked
python -m compileall -v src/
# Check without writing .pyc bytecode files
python -m compileall -b src/Pemeriksaan sintaks berbasis browser
Validator Sintaks Python di Aback Tools berjalan sepenuhnya di browser Anda. Tempel skrip Python apa pun - berapa pun panjangnya - dan dapatkan diagnostik level baris untuk error indentasi, token tanpa pasangan, string yang tidak ditutup, dan masalah struktural dalam waktu kurang dari satu detik. Kode Anda tidak pernah diunggah ke server, sehingga aman untuk skrip proprietary, alat internal, dan kode aplikasi rahasia.
| Pemeriksaan | Validator sintaks | Flake8 | Pylint | mypy |
|---|---|---|---|---|
| Titik dua / kurung hilang | ✓ Ya | ✓ Ya | ✓ Ya | ✓ Ya |
| IndentationError | ✓ Ya | ✓ Ya | ✓ Ya | ✓ Ya |
| Variabel tak terdefinisi (NameError) | ✗ Tidak | ✓ pyflakes | ✓ Ya | ✓ Ya |
| Import tak terpakai | ✗ Tidak | ✓ pyflakes | ✓ Ya | ⚠ Sebagian |
| Tipe tidak cocok | ✗ Tidak | ✗ Tidak | ⚠ Sebagian | ✓ Ya |
| Pelanggaran gaya PEP 8 | ✗ Tidak | ✓ pycodestyle | ✓ Ya | ✗ Tidak |
| Logika / keluaran salah | ✗ Tidak | ✗ Tidak | ✗ Tidak | ✗ Tidak |
Validator Sintaks Python
Periksa skrip Python untuk error sintaks dan indentasi secara instan - lokal di browser, diagnostik per baris, tanpa unggahan.
Membaca traceback Python
Traceback Python adalah catatan interpreter tentang bagaimana eksekusi sampai ke titik di mana exception dilempar. Membacanya secara efisien - alih-alih panik di depan dinding teks - adalah salah satu keterampilan debugging dengan dampak terbesar di Python. Traceback memberi tahu Anda persis di mana error bermula dan setiap panggilan fungsi yang mengarah ke sana.
Anatomi traceback Python
Traceback dimulai dengan baris `Traceback (most recent call last):` dan mencantumkan frame dari panggilan terluar di atas hingga lokasi error di bawah. Setiap frame menampilkan jalur file, nomor baris, nama fungsi, dan baris kode sumber. Dua baris terakhir menampilkan kelas exception dan pesannya - itulah error sebenarnya. Baca dari bawah ke atas: pahami dulu jenis errornya, lalu telusuri rantai panggilan ke atas untuk menemukan di bagian mana dalam kode Anda nilai bermasalah itu bermula.
Traceback (most recent call last):
File "main.py", line 42, in <module>
result = process_orders(orders) # outer call - your code
File "orders.py", line 17, in process_orders
total = calculate_total(order) # middle call - your code
File "orders.py", line 31, in calculate_total
return sum(item['price'] for item in order['items']) # origin
KeyError: 'items' # error type + messageDalam contoh ini, errornya adalah `KeyError` untuk kunci `'items'`. Sumbernya di baris 31 `orders.py`. Traceback memberi tahu Anda bahwa `order` tidak memiliki kunci `'items'` - struktur datanya berbeda dari yang diharapkan, atau kuncinya tidak pernah diatur. Buka `orders.py:31`, periksa apa isi `order` pada titik itu, lalu tambahkan pengaman atau perbaiki data di hulunya.
Jenis exception Python yang umum dan maknanya
- KeyError: Mengakses kunci dict yang tidak ada - gunakan `.get(key, default)` atau periksa dengan `key in d` lebih dulu.
- AttributeError: Memanggil metode atau mengakses properti yang tidak ada pada objek - periksa tipe objeknya.
- TypeError: Tipe yang salah diteruskan ke fungsi, atau beroperasi pada tipe yang tidak kompatibel (mis. `"text" + 5`).
- ValueError: Tipe benar tetapi nilai tidak valid - `int("abc")`, `math.sqrt(-1)`, atau fungsi yang menolak argumen di luar rentang.
- IndexError: Indeks list atau tuple di luar rentang - listnya lebih pendek dari asumsi.
- ImportError / ModuleNotFoundError: Modul tidak terinstal atau jalur importnya salah.
Tip
Penjelas Traceback Python
Tempel traceback Python apa pun dan dapatkan uraian terstruktur tentang frame asal, rantai panggilan, dan kemungkinan perbaikan - lokal di browser dan sepenuhnya privat.
Flake8, Pylint, dan analisis statis
Alat analisis statis membaca kode sumber Python Anda tanpa menjalankannya dan menerapkan serangkaian aturan yang menangkap masalah yang tak terlihat oleh pemeriksa sintaks - nama tak terdefinisi, import tak terpakai, fungsi yang terlalu kompleks, dan puluhan pola yang berkaitan dengan bug atau maintainability yang buruk. Flake8 dan Pylint adalah dua pilihan dominan, dan keduanya melayani titik yang berbeda pada kompromi kecepatan-vs-kedalaman.
Flake8 - cepat, composable, penegak PEP 8
Flake8 menggabungkan tiga alat: pyflakes (mendeteksi nama tak terdefinisi, import tak terpakai, dan variabel yang didefinisikan ulang), pycodestyle (menegakkan aturan gaya PEP 8 - panjang baris, whitespace di sekitar operator, baris kosong antar fungsi), dan mccabe (menandai fungsi dengan kompleksitas siklomatik di atas ambang yang dapat dikonfigurasi). Alat ini berjalan cepat, menghasilkan keluaran ringkas, dan punya ekosistem plugin yang kaya - plugin menambahkan pemeriksaan keamanan (`flake8-bugbear`), penegakan anotasi tipe (`flake8-annotations`), dan aturan khusus Django (`flake8-django`).
# Install Flake8
pip install flake8
# Check a single file
flake8 mymodule.py
# Check a directory
flake8 src/
# Ignore specific rules (E501 = line too long)
flake8 src/ --extend-ignore=E501
# Set maximum line length
flake8 src/ --max-line-length=100
# Count errors by code
flake8 src/ --statisticsPylint - analisis mendalam dan skoring
Pylint melakukan analisis statis yang lebih dalam daripada Flake8. Alat ini membangun pemahaman penuh atas struktur modul Anda, melacak tipe variabel antar penugasan, memeriksa kesesuaian signature metode dengan panggilannya, dan menegakkan serangkaian konvensi yang lebih luas. Ia juga menghasilkan skor kualitas numerik dari 0 sampai 10 yang bisa Anda lacak antar commit. Konsekuensinya adalah kecepatan - Pylint jauh lebih lambat daripada Flake8 pada codebase besar - dan verbositas: satu kali menjalankan Pylint pada proyek yang belum dioptimalkan bisa menghasilkan ratusan pesan yang perlu ditriase.
Mulailah dengan Flake8 untuk loop umpan balik CI yang cepat. Tambahkan Pylint secara selektif untuk code review dan audit pra-rilis. Jalankan mypy terus-menerus jika Anda memakai anotasi tipe. Tiga alat, tiga kedalaman berbeda.
Mengonfigurasi Flake8 dengan setup.cfg
Flake8 membaca konfigurasinya dari `setup.cfg`, `.flake8`, atau `tox.ini`. Konfigurasi minimal yang menetapkan panjang baris dan mengabaikan beberapa aturan yang berisik menjaga keluaran tetap dapat ditindaklanjuti tanpa menekan peringatan penting.
[flake8]
max-line-length = 100
extend-ignore = E203, W503
exclude =
.git,
__pycache__,
migrations/,
venv/
per-file-ignores =
tests/*: S101Note
Pemeriksaan tipe dengan mypy
Mypy adalah pemeriksa tipe statis yang membaca anotasi tipe Python - `def process(items: list[str]) -> int` - dan memverifikasi bahwa setiap fungsi dipanggil dengan argumen bertipe benar dan nilai kembalian digunakan secara semestinya. Ia tidak menjalankan kode Anda; ia menganalisis struktur dan menyimpulkan tipe dari anotasi yang Anda berikan. Error tipe yang tertangkap mypy tidak bisa menjadi exception `TypeError` atau `AttributeError` di produksi.
Yang tertangkap mypy dan terlewat Flake8
- Tipe tidak cocok: Meneruskan `str` ke fungsi yang mengharapkan `int`, atau mengembalikan `None` dari fungsi bertipe `-> str`.
- Keamanan Optional: Memanggil metode pada nilai bertipe `Optional[User]` tanpa memeriksa `None` terlebih dahulu.
- Penugasan tidak kompatibel: Mengassign `list[int]` ke variabel yang dideklarasikan sebagai `list[str]`.
- Jalur kembali yang hilang: Fungsi dengan cabang yang tidak mengembalikan apa pun padahal tipe kembaliannya bukan `None`.
- Ketidakcocokan overload: Memanggil fungsi dengan kombinasi tipe argumen yang salah untuk signature overload-nya.
Mulai dengan mypy
Mypy dapat diadopsi secara bertahap - Anda tidak perlu menganotasi setiap file sebelum merasakan manfaatnya. Mulailah dengan menjalankan `mypy src/` dengan flag `--ignore-missing-imports` untuk menekan error dari library pihak ketiga yang tidak memiliki type stub. Fokuslah menganotasi fungsi publik, variabel level modul, dan tipe kembalian fungsi terlebih dahulu. Helper `reveal_type(expr)` (dihapus saat runtime tetapi diproses mypy) menampilkan tipe yang disimpulkan mypy untuk ekspresi apa pun - berguna saat Anda tidak yakin mengapa sebuah pemeriksaan gagal.
# Install mypy
pip install mypy
# Basic check - report type errors in src/
mypy src/
# Ignore missing stubs for third-party libraries
mypy src/ --ignore-missing-imports
# Strict mode - enables all optional checks
mypy src/ --strict
# Check a single file
mypy orders.py
# Show error codes (useful for targeted suppression)
mypy src/ --show-error-codesTip
Pemeriksaan error di CI/CD
Pemeriksaan error manual selama pengembangan adalah praktik yang baik tetapi bukan jaminan. Mengotomatisasi pemeriksaan error Python di pipeline CI/CD memastikan tidak ada error sintaks, pelanggaran Flake8, atau error tipe yang bisa di-merge ke branch utama - terlepas dari apakah developer menjalankan pemeriksaan secara lokal.
Quality gate Python minimal
name: Python Quality
on:
pull_request:
paths: ['src/**/*.py', 'tests/**/*.py']
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- run: pip install flake8 mypy
- name: Syntax check
run: python -m compileall src/
- name: Flake8
run: flake8 src/ --max-line-length=100 --statistics
- name: mypy
run: mypy src/ --ignore-missing-importsLangkah `compileall` menangkap setiap error sintaks yang akan menghalangi import; Flake8 menangkap nama tak terdefinisi, import tak terpakai, dan pelanggaran gaya; mypy menangkap error tipe. Ketiga langkah keluar dengan kode non-nol saat gagal, yang memblokir merge pull request. Menjalankan pemeriksaan pada `pull_request` alih-alih `push` ke `main` berarti umpan balik datang selagi penulis masih bisa bertindak, bukan setelah merge.
Hook pre-commit untuk penegakan lokal
Hook pre-commit menjalankan pemeriksaan yang sama secara lokal sebelum commit dibuat. Framework `pre-commit` mengelola ini untuk proyek Python - tambahkan `.pre-commit-config.yaml` yang merujuk hook resmi Flake8 dan mypy, dan setiap kontributor mendapatkan pemeriksaan yang sama diterapkan otomatis saat commit tanpa setup manual.
| Alat | Yang ditangkap | Kecepatan | Privasi | Setup yang diperlukan |
|---|---|---|---|---|
| Validator Sintaks Python (Aback Tools) | Error sintaks + indentasi | Instan | ✓ 100% lokal | Tidak ada - berbasis browser |
| python -m py_compile | Error sintaks | Cepat | ✓ Lokal | Python terinstal |
| Flake8 | Sintaks + nama tak terdefinisi + PEP 8 | Cepat | ✓ Lokal | pip install flake8 |
| Pylint | Analisis mendalam + skoring | Lambat | ✓ Lokal | pip install pylint |
| mypy | Error tipe | Sedang | ✓ Lokal | pip install mypy + anotasi |
| Penjelas Traceback Python | Analisis exception runtime | Instan | ✓ 100% lokal | Tidak ada - berbasis browser |
Warning
Praktik terbaik debugging
Kebiasaan pemeriksaan error yang baik mengurangi waktu debugging secara signifikan. Praktik-praktik ini berlaku untuk skrip, aplikasi Django, pipeline data, dan konteks Python lainnya - alatnya berubah tetapi prinsipnya tetap sama.
Perbaiki error pertama, bukan semua error
Error sintaks Python berjalan berantai - titik dua yang hilang di baris 10 bisa menghasilkan tiga error terlapor yang terpisah saat parser kehilangan konteks. Selalu perbaiki error terlapor yang paling atas terlebih dahulu, lalu jalankan ulang pemeriksa. Yang tampak seperti lima bug seringkali satu. Hal yang sama berlaku untuk keluaran mypy: satu fungsi tanpa anotasi bisa memicu rangkaian error tipe di hilir, yang semuanya hilang begitu satu anotasi akar ditambahkan.
Gunakan anotasi tipe sejak awal
Menganotasi signature fungsi saat menulisnya menghabiskan waktu yang tak seberapa dan langsung terbayar: autocomplete editor Anda menjadi akurat, mypy menangkap penyalahgunaan di lokasi panggilan, dan dokumentasi terbawa di dalam kode. Mulailah dari signature fungsi publik - parameter dan tipe kembalian - sebelum berpindah ke variabel internal. Import `from __future__ import annotations` mengaktifkan sintaks evaluasi tertunda yang membuat anotasi kompatibel ke depan dengan versi Python lama.
Validasi data eksternal di batas sistem
Mayoritas exception `KeyError`, `TypeError`, dan `AttributeError` di produksi berasal dari data eksternal - respons API, hasil query database, input pengguna, atau file konfigurasi - yang tidak cocok dengan bentuk yang diharapkan. Gunakan model Pydantic atau dataclass untuk memvalidasi data masuk di batas sistem, bukan jauh di dalam logika bisnis. Untuk memeriksa pola regex yang dipakai mengurai teks eksternal, Penguji Regex Python memvalidasi pola modul `re` Anda secara langsung terhadap contoh input, mencegah exception runtime terkait regex sebelum mencapai produksi.
- Perbaiki error pertama lebih dulu: Error sintaks berjalan berantai - satu masalah nyata menghasilkan beberapa error terlapor.
- Aktifkan Flake8 di editor Anda: Umpan balik real-time menangkap error saat Anda mengetik, bukan setelah commit.
- Tambahkan mypy secara bertahap: Anotasi API publik dulu; pakai `--allow-untyped-defs` selama migrasi.
- Validasi data eksternal: Respons API dan file konfigurasi harus diperiksa di batas sistem, bukan diasumsikan benar.
- Tulis tes untuk jalur kritis: Unit test menyingkap error logika yang tidak bisa dideteksi alat statis mana pun.
- Gunakan Penjelas Traceback untuk error yang tak dikenal: Tempel traceback Python apa pun untuk uraian terstruktur yang instan.
Tip
Key takeaways
- Error sintaks tertangkap sebelum eksekusi - gunakan Validator Sintaks Python untuk pemeriksaan instan lokal di browser, atau `python -m py_compile` untuk pemeriksaan CLI tanpa instalasi tambahan.
- Traceback menunjukkan rantai panggilan lengkap sampai error - baca dari bawah ke atas, identifikasi frame pertama di kode Anda sendiri, dan gunakan Penjelas Traceback Python untuk uraian terstruktur.
- Flake8 menggabungkan pemeriksaan sintaks, deteksi nama tak terdefinisi, dan penegakan PEP 8 dalam satu alat yang cepat - pilihan praktis bawaan untuk sebagian besar proyek Python.
- Pylint melakukan analisis lebih dalam dan menghasilkan skor kualitas, membuatnya paling berharga untuk code review dan audit pra-rilis alih-alih pemeriksaan setiap commit.
- Mypy menangkap error tipe sebelum menjadi exception runtime - adopsi secara bertahap mulai dari signature fungsi publik.
- Tambahkan `python -m compileall`, Flake8, dan mypy ke pipeline CI/CD Anda agar tidak ada error sintaks atau tipe yang bisa di-merge tanpa terdeteksi.
- Jangan pernah mengunggah kode Python proprietary ke linter online sisi server - Validator Sintaks Python dan Penjelas Traceback Aback Tools memproses semuanya sepenuhnya di browser Anda.