Lompat ke konten
Aback Tools Logo

Apa Itu Traceback? Cara Membaca dan Memperbaiki Error

Traceback menunjukkan apa yang salah, di mana, dan bagaimana program sampai ke sana. Pelajari strukturnya, cara membaca traceback Python, enam jenis exception paling umum, dan alur debugging-nya.

DH
Tutorials & How-Tos12 menit baca2,750 kata

Traceback adalah cara runtime sebuah bahasa mengatakan dengan tepat apa yang salah, di mana tepatnya, dan bagaimana program sampai ke sana. Ketika exception yang tidak ditangani terjadi di Python, traceback adalah catatan lengkap setiap pemanggilan fungsi yang aktif pada saat itu - peta akurat dari gejala yang terlihat kembali ke akar penyebabnya. Membacanya dengan lancar adalah salah satu keterampilan debugging dengan hasil terbesar yang bisa Anda kuasai.

BawahBaca pertamaException selalu di akhir
6Jenis paling umumType, Attribute, Name, Key, Index, Import
1000Batas frame defaultBatas kedalaman rekursi Python

Apa itu traceback?

Traceback (juga disebut stack trace di sebagian besar bahasa lain) adalah laporan error terstruktur yang dihasilkan otomatis oleh runtime bahasa pemrograman ketika terjadi exception yang tidak ditangani. Laporan ini merekam keadaan call stack pada saat persis error dimunculkan: daftar pemanggilan fungsi yang aktif, jalur file-nya, dan nomor barisnya.

Apa yang diberitahukan traceback

  • Apa yang salah: jenis exception dan pesan error - baris paling penting
  • Di mana terjadi: jalur file dan nomor baris setiap frame fungsi yang aktif
  • Bagaimana sampai ke sana: rantai pemanggilan lengkap dari titik masuk hingga baris yang gagal
  • Kode mana milik Anda: file proyek Anda muncul bersama frame pustaka dan sistem

Traceback vs stack trace - hal yang sama, nama berbeda

Python memakai kata "traceback". Java, JavaScript, Go, Ruby, dan sebagian besar bahasa lain menyebut "stack trace". Kedua istilah menggambarkan konsep yang sama - urutan frame fungsi yang tercatat pada saat kegagalan. Perbedaannya murni terminologi. Ketika developer Python berkata "baca traceback-nya" dan developer JavaScript berkata "baca stack trace-nya", maksudnya tindakan debugging yang sama.

Note

Traceback hanya dihasilkan untuk exception yang **tidak ditangani** - error yang tidak tertangkap oleh blok `try/except` (Python) atau `try/catch` (JavaScript). Jika kode Anda menangkap exception secara diam-diam, tidak ada traceback yang muncul. Itulah sebabnya menelan exception tanpa mencatatnya adalah anti-pola debugging.

Struktur sebuah traceback

Setiap traceback Python mengikuti struktur yang sama. Memahaminya membuat Anda bisa langsung menuju informasi yang relevan alih-alih membaca setiap baris dari sesuatu yang kadang berisi ratusan frame.

Baris header

Setiap traceback Python diawali `Traceback (most recent call last):`. Header ini memberi tahu konvensi urutannya: daftar frame setelahnya berjalan dari yang paling lama (paling luar) di atas hingga yang paling baru (paling dekat dengan error) di bawah. Frasa "most recent call last" adalah kuncinya - frame terakhir sebelum pesan exception adalah yang pertama harus Anda lihat.

Frame-frame

Setiap frame terdiri dari dua baris. Baris pertama menunjukkan jalur file, nomor baris, dan nama fungsi dengan format `File "jalur/ke/file.py", line N, in nama_fungsi`. Baris kedua menunjukkan kode sumber sebenarnya pada baris itu - disalin langsung dari file. Frame diurutkan dari fungsi pertama yang dipanggil (biasanya skrip titik masuk Anda) hingga fungsi yang memunculkan exception. Frame paling dalam adalah titik awal yang paling penting.

Baris exception

Baris terakhir traceback adalah exception itu sendiri: `JenisException: teks pesan error`. Jenis exception menunjukkan kategori error (`TypeError`, `ValueError`, `AttributeError`). Pesannya memberikan konteks spesifik - nilai persis yang salah, nama atribut yang hilang, atau kunci yang tidak ditemukan. Selalu baca baris ini lebih dulu.

Baca baris terakhir lebih dulu. Jenis exception dan pesannya memberi tahu apa yang salah. Semua di atasnya memberi tahu di mana.

- Prinsip debugging Python

Cara membaca traceback Python

Membaca traceback secara efisien adalah keterampilan yang bisa dipelajari. Kuncinya adalah tahu ke mana harus melihat dulu dan apa yang harus diabaikan pada pembacaan pertama. Sebagian besar developer membaca dari atas ke bawah, arah yang salah - itu membuang waktu pada konteks rantai pemanggilan luar sebelum Anda melihat error-nya.

1

Baca jenis exception dan pesannya di bagian bawah

Langsung lompat ke baris terakhir traceback. `TypeError: unsupported operand type(s) for +: 'int' and 'str'` mengatakan semuanya - operator `+` dipakai antara integer dan string. `KeyError: 'user_id'` berarti dictionary diakses dengan kunci yang tidak ada. Baca baris ini dan bentuk hipotesis sebelum melihat frame-nya.

2

Temukan frame di kode Anda sendiri

Telusuri frame untuk mencari jalur file yang termasuk proyek Anda. Frame pustaka (`site-packages`, `lib/python3.x`, `dist-packages`) hampir selalu menunjukkan perilaku pustaka yang benar yang dipicu input buruk dari kode Anda. Frame paling dalam yang menunjukkan jalur di dalam proyek Anda adalah tempat bug berada. Frame pustaka satu tingkat di bawahnya menunjukkan fungsi pustaka mana yang dipanggil dengan input tidak valid.

3

Baca baris sumber dan konteks di sekitarnya

Catat nomor baris persisnya dan buka file itu di editor. Baca 5-10 baris di atasnya untuk memahami variabel apa yang ada dan nilai apa yang mungkin dimilikinya. `TypeError` pada `result = price + tax` terjelaskan ketika melihat `price = get_price()` dua baris di atasnya dan tahu bahwa `get_price()` mengembalikan string dari kueri database, bukan angka.

4

Gunakan dekoder traceback untuk exception yang tidak dikenal

Untuk jenis exception yang tidak Anda kenali, atau rantai pemanggilan yang sangat bersarang lintas beberapa pustaka, tempelkan traceback ke penjelas traceback Python. Alat itu mengklasifikasikan kategori exception, mengidentifikasi frame yang paling bisa ditindaklanjuti, dan memberi langkah debugging yang konkret - jauh lebih cepat daripada mencari dokumentasi untuk jenis error yang tidak dikenal.

Penjelas traceback Python

Tempelkan traceback Python apa pun untuk mendapat penjelasan error dalam bahasa sederhana, frame yang paling bisa ditindaklanjuti, dan langkah debugging berikutnya - di browser, tanpa akun.

Open tool

Jenis traceback Python yang umum

Enam jenis exception Python paling umum menjelaskan sebagian besar traceback dalam pengembangan sehari-hari. Mengenali jenisnya dari baris terakhir traceback memungkinkan Anda membentuk hipotesis yang akurat tentang penyebabnya sebelum membaca satu frame pun.

Jenis exceptionArtinyaPenyebab paling umumLangkah pertama
TypeErrorTipe salah untuk operasiString di tempat yang butuh intPeriksa tipe variabel di sekitar baris yang gagal
AttributeErrorObjek tidak punya atribut ituObjek None, kelas salahPeriksa apakah variabel bisa bernilai None
NameErrorVariabel tidak didefinisikanSalah ketik, scope salah, impor hilangPeriksa ejaan dan impor
KeyErrorKunci tidak ada di dictSalah ketik kunci, data hilangPakai .get() atau periksa kunci dulu
IndexErrorIndeks list di luar rentangSelisih satu, list kosongPeriksa panjang list sebelum mengindeks
ImportErrorModul tidak ditemukanBelum terpasang, nama salahPasang paket dengan pip, periksa ejaan

TypeError: traceback paling sering muncul

`TypeError` adalah exception paling umum di Python. Exception ini muncul setiap kali operasi diterapkan pada tipe yang salah: memanggil sesuatu yang tidak bisa dipanggil, menjumlahkan string dengan integer, mengirim jumlah argumen yang salah. Pesannya biasanya presisi: `TypeError: can only concatenate str (not "int") to str` tidak menyisakan ambiguitas tentang tipe yang terlibat. Identifikasi variabel mana yang bertipe tak terduga dan telusuri kembali ke tempat variabel itu ditetapkan.

AttributeError: jebakan None

`AttributeError: 'NoneType' object has no attribute 'split'` adalah salah satu pola traceback paling umum. Artinya sebuah fungsi mengembalikan `None` padahal kode Anda mengharapkan string (atau objek lain). Errornya bukan karena `.split()` salah - melainkan karena variabel yang dipanggilinya bernilai `None`. Telusuri ke tempat variabel itu ditetapkan. Periksa apakah fungsi yang menghasilkannya bisa mengembalikan `None` dalam kondisi tertentu dan tambahkan pengaman.

Warning

`RecursionError: maximum recursion depth exceeded` adalah kasus khusus. Traceback-nya akan sangat panjang - frame yang sama berulang ratusan kali. Jangan coba membaca semuanya. Lihat frame yang berulang untuk mengidentifikasi fungsi yang terjebak rekursi tak berujung, lalu perbaiki base case di logika fungsi itu. Menaikkan `sys.setrecursionlimit` bukan perbaikan - itu hanya menunda crash.

Traceback di bahasa lain

Setiap bahasa pemrograman besar menghasilkan stack trace saat terjadi error yang tidak ditangani. Format dan terminologinya berbeda, tetapi strategi membaca yang sama berlaku: temukan pesan exception lebih dulu, lalu temukan frame di kode Anda.

Stack trace JavaScript dan Node.js

Stack trace JavaScript dimulai dengan jenis error dan pesannya di baris pertama - kebalikan dari Python yang menempatkan exception di akhir. Setiap frame di bawahnya menunjukkan nama fungsi, jalur file, dan baris:kolom. Stack trace Node.js memakai format `at NamaFungsi (file:baris:kolom)`. Di JavaScript browser, frame merujuk nama file yang diminifikasi dan nomor baris yang dipadatkan kecuali ada source map. Penjelas stack trace JavaScript mendekode trace yang terbaca maupun yang diminifikasi.

Stack trace Java dan bahasa JVM

Stack trace Java dimulai dengan nama kelas exception diikuti pesannya, lalu mencantumkan frame sebagai `at paket.Kelas.metode(File.java:baris)`. Trace Java cenderung dalam karena hierarki kelas JVM - satu operasi bisa melibatkan lebih dari 20 frame melewati lapisan framework. Aturan yang sama berlaku: temukan frame pertama di paket aplikasi Anda (bukan `java.lang`, `springframework`, atau paket framework lain) dan mulai debugging di sana.


Go, Rust, dan bahasa terkompilasi lainnya

Panic di Go menghasilkan stack trace goroutine yang menunjukkan rantai pemanggilan setiap goroutine saat crash. Panic di Rust menyertakan backtrace ketika variabel lingkungan `RUST_BACKTRACE=1` diatur. Keduanya mengikuti pola yang sama: pesan error muncul dekat bagian atas, frame diurutkan dari yang terbaru di atas ke bawah (kebalikan Python), dan kode aplikasi Anda berselang-seling dengan frame pustaka standar dan runtime. Generator checklist akar masalah dari stack trace menangani trace Go, Rust, Java, JavaScript, dan Python dalam satu alat.

Debugging dengan traceback

Traceback menunjukkan masalahnya, tetapi memperbaikinya menuntut pemahaman mengapa kondisi error itu terjadi - bukan hanya di mana. Alur berikut mengubah traceback mentah menjadi perbaikan yang terkonfirmasi dengan langkah minimum.

Reproduksi error lebih dulu

Sebelum mengubah kode apa pun, pastikan Anda bisa mereproduksi error dengan input yang diketahui. Perbaikan untuk error yang tidak dapat direproduksi tidak bisa diuji. Jika traceback berasal dari log produksi atau kegagalan CI, ekstrak nilai input dari konteks log dan tulis kasus uji minimal yang memicu traceback yang sama. Ini memberi Anda kriteria keberhasilan untuk perbaikan tersebut.

Dekode traceback produksi

Traceback produksi sering merujuk kode yang diminifikasi, dikompilasi, atau ditransformasi. Traceback JavaScript dari produksi biasanya menampilkan `bundle.js` dengan nomor baris satu digit. Traceback Python dari deployment dalam kontainer bisa merujuk jalur file yang berbeda dari mesin pengembangan Anda. Helper deobfuskasi stack trace membantu trace yang diminifikasi dengan mengenali pola struktural dan memprioritaskan frame yang paling bisa ditindaklanjuti bahkan tanpa source map.

  • Reproduksi secara lokal: ekstrak input dari log dan tulis kasus uji minimal yang gagal
  • Isolasi frame: identifikasi frame mana di kode Anda yang membuat input gagal diteruskan
  • Periksa tipe: tambahkan sementara `print(type(variable))` atau `console.log(typeof variable)` di baris error untuk memastikan tipe
  • Telusuri penetapan: temukan tempat variabel bermasalah terakhir ditetapkan dan telusuri mundur hingga nilai salah masuk
  • Perbaiki dan jalankan ulang: pastikan traceback tidak lagi muncul dengan input yang sama setelah perbaikan Anda

Tip

Untuk traceback panjang dengan banyak frame, gunakan [generator checklist akar masalah dari stack trace](/tools/data/validators/stack-trace-to-root-cause-checklist-generator) untuk mendapat checklist debugging terstruktur dengan domain kesalahan yang diprioritaskan - alat ini bekerja pada trace Python, JavaScript, Java, dan Go serta menangani format terbaca maupun yang sebagian diminifikasi.

Praktik terbaik traceback

Cara Anda menangani traceback di basis kode menentukan seberapa cepat Anda bisa men-debug masalah di produksi, seberapa banyak konteks yang Anda punya saat terjadi kegagalan, dan seberapa andal Anda menangkap error selama pengembangan. Praktik ini membuat traceback lebih berguna sepanjang siklus hidup proyek.

Selalu catat traceback lengkap di produksi

Exception produksi yang hanya menyisakan pesan error tanpa traceback hampir tidak berguna untuk debugging. Konfigurasikan sistem logging Anda untuk menangkap traceback lengkap: di Python gunakan `logging.exception("pesan")` di dalam blok `except`, bukan `logging.error()`, karena `exception()` otomatis menyertakan traceback saat ini. Di Node.js catat `error.stack`, bukan hanya `error.message`. Beberapa byte tambahan penyimpanan log terbayar pada kali pertama bug dilacak dalam waktu kurang dari satu menit karena seluruh konteks tersimpan.

Validasi input sebelum menyebabkan traceback

Banyak traceback bisa dicegah dengan validasi input di batas sistem. `TypeError` akibat fungsi menerima `None` bukan string dihilangkan dengan memeriksa input sebelum diteruskan. Gunakan validator sintaks Python untuk menangkap kesalahan sintaks sebelum menghasilkan traceback runtime saat impor, dan tambahkan type hint dengan pemeriksa seperti mypy agar kesalahan tipe tertangkap secara statis sebelum kode dijalankan.

Tip

Tambahkan `RUST_BACKTRACE=1` (Rust) atau `NODE_OPTIONS="--stack-trace-limit=50"` (Node.js) ke lingkungan pengembangan Anda untuk mendapat trace yang lebih lengkap selama pengembangan. Python menampilkan traceback lengkap secara default - tetapi di framework web seperti Django dan Flask, atur `DEBUG=True` secara lokal untuk melihat trace lengkap di respons browser alih-alih halaman error generik.

Generator checklist akar masalah dari stack trace

Tempelkan stack trace Python, JavaScript, Java, atau Go apa pun untuk mendapat checklist debugging terstruktur dengan domain kesalahan yang diprioritaskan dan langkah penyelesaian - tanpa pendaftaran, di browser.

Open tool

Key takeaways

  • Traceback adalah call stack yang tercatat saat exception tidak tertangani terjadi - ia menunjukkan apa yang salah, di mana, dan bagaimana program sampai ke sana.
  • Baca baris terakhir lebih dulu - jenis exception dan pesannya memberi tahu apa yang salah. Frame di atasnya memberi tahu di mana.
  • Frame yang paling bisa ditindaklanjuti adalah yang paling dalam di kode Anda sendiri - bukan frame pustaka, yang biasanya berperilaku benar dengan input buruk dari kode Anda.
  • Enam exception Python paling umum adalah TypeError, AttributeError, NameError, KeyError, IndexError, dan ImportError - mengenalinya sekilas mempercepat debugging.
  • Gunakan penjelas traceback Python untuk jenis exception yang tidak dikenal atau rantai pemanggilan yang sangat bersarang guna mendapat penjelasan sederhana dan langkah debugging.
  • Selalu catat traceback lengkap (bukan hanya pesan error) di produksi - traceback tanpa frame hampir tidak berguna untuk debugging setelah kejadian.
  • Validasi input di batas sistem dan gunakan type hint dengan pemeriksa statis agar traceback kelas TypeError dan AttributeError tidak sampai ke waktu eksekusi.

Pertanyaan yang sering diajukan

Traceback adalah laporan yang dihasilkan runtime sebuah bahasa pemrograman ketika terjadi error yang tidak ditangani saat eksekusi. Laporan ini mencantumkan urutan pemanggilan fungsi yang aktif pada saat error dimunculkan, mulai dari pemanggilan paling luar hingga baris tempat error terjadi. Setiap entri dalam daftar disebut frame. Frame terakhir adalah tempat exception dimunculkan; frame di atasnya menunjukkan bagaimana program sampai ke sana. Traceback memberi semua yang Anda butuhkan untuk menemukan bug tanpa memakai debugger.

"Traceback (most recent call last)" adalah header setiap traceback Python. Header ini memberi tahu bahwa daftar frame di bawahnya diurutkan dengan pemanggilan fungsi terbaru - yang paling dekat dengan error - berada di bagian bawah. Ini format standar Python. Baris terakhir setelah semua frame menunjukkan jenis exception dan pesannya yang sebenarnya. Selalu baca dari bawah ke atas: jenis exception dulu, lalu frame di kode Anda sendiri, lalu rantai pemanggilan luar untuk konteks.

Traceback dan stack trace merujuk pada konsep yang sama - rantai pemanggilan yang tercatat saat error terjadi. Python memakai istilah "traceback"; Java, JavaScript, Go, dan sebagian besar bahasa lain menyebutnya "stack trace". Keduanya menampilkan informasi yang sama: daftar frame, masing-masing berisi nama file, nomor baris, dan nama fungsi, menuju tempat exception dimunculkan. Perbedaannya murni terminologi dan bergantung pada bahasa.

Mulai dari bagian bawah traceback. Baris terakhir berisi jenis exception dan pesannya - ini memberi tahu apa yang salah. Blok kedua dari bawah menunjukkan file dan baris persis tempat exception dimunculkan. Telusuri ke atas untuk mencari frame yang merujuk file proyek Anda (bukan jalur pustaka standar Python atau pustaka pihak ketiga). Frame pertama di kode Anda sendiri adalah tempat bug paling mungkin berada. Perbaiki di sana, bukan di pustaka yang memunculkan exception, karena pustaka tersebut berperilaku benar dengan input yang diterimanya.

Exception Python paling umum yang menghasilkan traceback adalah: TypeError (operasi diterapkan pada tipe yang tidak kompatibel, misalnya menjumlahkan string dengan integer), AttributeError (mengakses atribut yang tidak ada pada objek), NameError (merujuk variabel yang belum didefinisikan), IndexError (mengakses indeks list yang tidak ada), KeyError (mengakses kunci dictionary yang tidak ada), dan ImportError/ModuleNotFoundError (Python tidak menemukan modul yang Anda coba impor).

RecursionError ("maximum recursion depth exceeded") terjadi ketika sebuah fungsi memanggil dirinya sendiri berulang kali tanpa base case yang berfungsi, sehingga call stack tumbuh hingga mencapai batas keamanan Python (default 1000 frame). Traceback untuk RecursionError sangat panjang - fungsi yang sama muncul ratusan kali. Perbaikannya selalu ada di logika fungsi tersebut: tambahkan atau perbaiki base case, atau susun ulang algoritma secara iteratif. Menaikkan batas rekursi dengan sys.setrecursionlimit adalah cara sementara, bukan perbaikan.

Traceback berantai muncul ketika satu exception dimunculkan saat menangani exception lain. Python menampilkan kedua exception yang dipisahkan oleh "During handling of the above exception, another exception occurred" atau "The above exception was the direct cause of the following exception." Exception asli (penyebab) muncul lebih dulu dan exception kedua menyusul. Untuk men-debug traceback berantai, mulailah dari penyebab - exception asli di bagian atas - karena memperbaikinya sering menghilangkan exception kedua sepenuhnya.

Stack trace JavaScript yang diminifikasi merujuk nama file yang diobfuskasi dan nomor baris yang dipadatkan sehingga tidak terbaca tanpa source map. Source map adalah file .map yang dihasilkan saat proses build dan menerjemahkan posisi hasil minifikasi kembali ke kode sumber asli. Jika Anda punya source map, impor ke dekoder stack trace. Jika tidak, helper deobfuskasi stack trace dari Aback Tools tetap dapat mengenali pola frame yang dapat ditindaklanjuti dan memberi arah debugging dari trace yang diminifikasi.

ShareXLinkedIn