Kursus Python / Menelusuri kesalahan dengan traceback, debugger, dan logging
Mulai pencarian kesalahan dengan membaca jenis pengecualian serta lokasi kode pada traceback, lalu ulangi masukan yang memicunya. Debugger membantu memeriksa keadaan eksekusi, sedangkan logging mencatat peristiwa terpilih menurut tingkat kepentingannya.
Temukan kasus yang dapat diulang
Baca baris terakhir traceback untuk mengetahui jenis kesalahan dan pesannya. Telusuri bagian di atasnya untuk menemukan berkas serta baris kode Anda dalam rantai pemanggilan. Lokasi terakhir menunjukkan tempat kegagalan terdeteksi, tetapi penyebabnya dapat berupa masukan atau keadaan yang dibuat lebih awal.
Catat input, interpreter, cara menjalankan, dan pengaturan yang relevan. Kurangi kasus sampai menjadi contoh kecil yang masih gagal. Jangan langsung mengubah pustaka eksternal sebelum memastikan apa yang dikirim oleh kode sendiri. Penanganan pengecualian membantu membedakan kegagalan yang dipulihkan dengan kegagalan yang masih harus terlihat.
Untuk mengamati dengan VS Code, buka folder latihan, pilih interpreter proyek melalui Python: Select Interpreter, dan buka berkas Python. Pastikan dukungan Python dan Python Debugger tersedia. Klik gutter di sebelah baris kondisi pemeriksaan jumlah negatif untuk menambahkan breakpoint, lalu pilih Run and Debug dan konfigurasi berkas Python saat ini. Saat berhenti, periksa amounts pada Variables, rantai Call Stack, dan jalankan satu langkah dengan Step Over. Hapus breakpoint atau hentikan sesi setelah selesai. Pilihan konfigurasi dapat berbeda menurut proyek; lihat panduan resmi Python debugging di VS Code.
Jalankan perhitungan dengan log
Simpan kode lengkap berikut sebagai logging_demo.py dengan encoding UTF-8. Gunakan Python 3.12 atau lebih baru melalui lingkungan proyek, lalu jalankan python logging_demo.py. Program tidak membutuhkan paket pihak ketiga.
import logging
logging.basicConfig(level=logging.INFO, format="%(levelname)s:%(message)s")
logger = logging.getLogger(__name__)
def calculate(amounts):
logger.debug("count=%s", len(amounts))
if any(x < 0 for x in amounts):
raise ValueError("negative amount")
return sum(amounts)
try:
total = calculate([3500, 8000, 2500])
except ValueError:
logger.exception("calculation failed")
raise SystemExit(1)
else:
logger.info("total=%s", total)
print("finished")
Standard output atau stdout yang diharapkan:
finished
Standard error atau stderr juga memuat INFO:total=14000. Kedua saluran dapat terlihat pada terminal yang sama, tetapi blok keluaran di atas hanya menunjukkan stdout. Proses normal selesai dengan kode keluar 0.
logging.getLogger(__name__) memberi logger yang namanya mengikuti modul. basicConfig pada contoh mengatur konfigurasi dasar aplikasi. Jalankan sebagai proses baru saat membandingkan konfigurasi, sebab lingkungan seperti notebook atau aplikasi lain mungkin sudah mempunyai handler sehingga pemanggilan konfigurasi dasar tidak memberikan efek yang sama.
Pilih tingkat dan bedakan saluran keluaran
| Tingkat | Peran umum |
|---|---|
| DEBUG | Rincian diagnosis, misalnya jumlah unsur masukan |
| INFO | Kejadian normal atau hasil proses |
| WARNING | Kondisi yang perlu diperhatikan |
| ERROR | Operasi gagal |
Terapkan tingkat secara konsisten menurut kebijakan aplikasi. Pada pengaturan INFO, pesan DEBUG count=3 tidak tampil. Mengubah pengaturan ke DEBUG menambah pesan tersebut tanpa mengubah perhitungan. Panduan logging Python menjelaskan pemilihan tingkat dan konfigurasi dasar.
Handler bawaan konfigurasi ini menulis log ke stderr, sedangkan print menulis ke stdout. Alat yang menggabungkan kedua saluran dapat memperlihatkan urutan pengamatan berbeda karena buffering dan cara pengumpulan. Periksa masing-masing saluran ketika urutan tampilan membingungkan.
Jika satu nilai diganti menjadi -1, fungsi menaikkan ValueError. Penangan memanggil logger.exception dari konteks pengecualian untuk merekam pesan gagal beserta traceback, lalu SystemExit(1) mengakhiri proses dengan kode 1. Baris finished tidak dijalankan. Logging sendiri hanya mencatat; tanpa tindakan keluar atau penerusan kesalahan, aplikasi dapat tetap berakhir dengan kode 0 setelah mencatat ERROR.
Periksa kode segera setelah perintah program: PowerShell memakai $LASTEXITCODE, sedangkan shell macOS atau Ubuntu dapat memakai echo $?. Jangan menjalankan perintah lain dahulu jika ingin memeriksa status program yang baru selesai. Perilaku kode keluar terkait SystemExit dan sys.exit.
Latih kegagalan sengaja dan simpan konteks secukupnya
- Jalankan sumber asli dan pastikan stdout memuat
finished, stderr memuatINFO:total=14000, dan kode keluar 0. - Ubah hanya 8000 menjadi -1. Pastikan log memuat kegagalan dan traceback, tidak ada
finished, serta kode keluar 1. Gunakan masukan yang sama pada debugger untuk memeriksa keadaan sebelum kondisi gagal. - Pulihkan nilai 8000 dan ubah tingkat ke DEBUG. Pastikan log
count=3bertambah sementara hasil tetap 14000. - Pulihkan tingkat INFO, jalankan ulang, dan cocokkan perilaku normal. Jangan menutup kegagalan dengan penangan luas kosong hanya untuk menghilangkan traceback.
Jangan mencatat kata sandi, header autentikasi, atau seluruh record data pribadi. Pilih konteks seperti operasi yang gagal dan identitas tugas yang tidak rahasia. Penggunaan placeholder seperti logger.info("total=%s", total) memisahkan format pesan dari nilai yang hendak dicatat.
Jika log dialihkan ke berkas untuk operasi nyata, tetapkan lokasi yang dapat ditulis, rotasi ukuran atau waktu, masa simpan, serta akses pembacanya. Mencatat objek besar pada setiap iterasi dapat menghabiskan penyimpanan dan waktu tanpa menambah nilai diagnosis. Pesan pengguna dan catatan pengembang melayani tujuan berbeda; pilih isi keduanya secara sengaja.




