edubun
Bahasa Indonesia

Membaca pesan kesalahan dan proyek kecil

Traceback Python dibaca dari bawah: baris terakhir menyebut jenis kesalahan, dan baris kode tepat di atasnya menunjukkan tempat kesalahan itu terjadi.

Ngengat yang ditempel dalam buku catatan pada 1947

Latar belakangPada 1947, teknisi yang bekerja dengan komputer Mark II di Harvard University menemukan ngengat tersangkut pada salah satu komponennya. Mereka menempelkan serangga itu dalam buku catatan dan menulis di sampingnya "first actual case of bug being found." Halaman itu kini berada di National Museum of American History milik Smithsonian. Dalam deskripsi museum, dua detail yang sering diceritakan dijelaskan dengan hati-hati. Teknisi sudah menyebut gangguan kecil sebagai "bug" jauh sebelumnya, dan Thomas Edison menggunakan kata itu pada tahun 1870-an. Jadi, ngengat itu bukan asal istilahnya; leluconnya justru dapat dipahami karena kata itu sudah ada. Grace Hopper, yang menjadi anggota tim Mark II pada tahun itu, mungkin bukan orang yang menulis buku catatan tersebut, meskipun ia dan tim membantu menjadikan "bug" dan "debug" istilah sehari-hari bagi pemrogram.

Kini kebanyakan bug adalah kekeliruan dalam kode, dan Python cukup baik dalam menjelaskan yang dapat dideteksinya. Pemula sering menganggap kesalahan merah sebagai vonis. Sebenarnya, pesan itu lebih mirip catatan pengiriman barang: apa yang salah, pada baris mana, dan dalam bagian kode mana. Yang penting adalah tahu tempat membacanya.

Baca traceback dari bawah ke atas

total = 0
count = 0
print(total / count)
Keluaran
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(total / count)
          ~~~~~~^~~~~~~
ZeroDivisionError: division by zero
Baca dalam urutan 1, 2, 3: tipe dan pesan kesalahan pada baris terakhir, lalu berkas dan nomor baris, kemudian bagian kode yang ditandai.

Mulai dari baris terakhir. ZeroDivisionError: division by zero memberikan tipe kesalahan dan penjelasan singkat. Lalu naik ke baris File: nama berkas (di komputermu, jalur folder lengkap muncul di sana; di sini disingkat menjadi main.py) dan nomor baris, 3. Baris di bawahnya adalah kode itu sendiri, dan Python 3.12 menandai operasi yang gagal dengan ^ di bawah tanda /. Baca ketiganya sebelum mulai mengubah apa pun. Jika kesalahan terjadi di dalam fungsi, traceback mencantumkan setiap pemanggilan yang mengarah ke sana, dan baris File paling bawah biasanya diperiksa lebih dahulu.

KesalahanPenyebab umumContoh
SyntaxErrorBaris bukan Python yang sah: kurung, titik dua, atau tanda kutip kurangprint("hi"
IndentationErrorInden tidak ada atau tidak seragamif x > 1: tanpa baris berinden
NameErrorNama yang belum ada, sering akibat salah ketikpritn("hi")
TypeErrorOperasi pada tipe yang salah"Age: " + 15
ValueErrorTipe benar, nilai tidak mungkin digunakanint("abc")
IndexErrorIndeks melewati akhir list atau string[1, 2][2]
KeyErrorKunci tidak ada dalam dictionary{"a": 1}["b"]
ZeroDivisionErrorMembagi dengan nol5 / 0

SyntaxError berbeda dari yang lain. Python menemukannya sebelum menjalankan apa pun, sehingga baris 1 pun tidak dijalankan dan tidak ada judul "Traceback". Semua kesalahan lainnya terjadi saat program berjalan, setelah baris sebelumnya selesai bekerja. Jika kamu memperkirakan kesalahan tertentu, tangkap dengan try dan except, yang dibahas dalam bab kesalahan pada tutorial: Python mencoba blok berinden, dan jika kesalahan itu terjadi, blok except dijalankan alih-alih menghentikan program.

print("before")
n = int("abc")
print("after")
Keluaran
before
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    n = int("abc")
        ^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'
text = "abc"
try:
    n = int(text)
except ValueError:
    n = 0
print(n)
Keluaran
0

Bug tersulit tidak memberikan pesan sama sekali. Kesalahan logika terjadi ketika program berjalan tetapi mencetak jawaban salah, seperti program penilaian pada unit if yang memberi C untuk 85. Python tidak bisa mengetahui maksudmu. Untuk kasus ini, kembali ke tabel penelusuran atau tambahkan baris print sementara yang menampilkan variabel pada setiap langkah, lalu hapus setelah bug ditemukan.

Proyek kecil: catatan uang saku

Dalam proyek ini, kamu menggunakan materi dari hampir setiap unit: dictionary pengeluaran, fungsi yang mengembalikan jumlah, perulangan for, f-string, dan if. Ketik, jalankan, lalu sesuaikan: ubah item, tambahkan kategori, atau beri peringatan saat satu item menghabiskan lebih dari separuh uang saku.

def total(spent):
    t = 0
    for amount in spent.values():
        t += amount
    return t

allowance = 30000
spent = {"snacks": 4500, "bus card": 10000, "notebook": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
    print(f"{item}: {amount} won")
print(f"Spent {used}, left {left}")
if left < 15000:
    print("Less than half left")
Keluaran
snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half left

Sebelum mengubahnya, tulis tabel penelusuran untuk used dan left, lalu perkirakan yang terjadi jika kamu menambahkan item seharga 6000 won. Setelah itu, buat kesalahan dengan sengaja: hapus titik dua setelah baris def, salah ketik spent sekali, dan bagi used dengan nol. Baca setiap traceback dari bawah sebelum memperbaikinya. Kemampuan merusak program lalu memperbaikinya kembali adalah keterampilan yang sebenarnya kamu latih sepanjang pelajaran ini.

tracebackLaporan kesalahan Python; baca dari bawah
SyntaxErrorKode tidak sah, ditemukan sebelum apa pun dijalankan
NameErrorNama yang tidak ada, sering akibat salah ketik
TypeErrorOperasi pada tipe nilai yang salah
ValueErrorTipe benar dengan nilai yang tidak mungkin digunakan, seperti int("abc")
kesalahan logikaBerjalan tanpa pesan tetapi memberikan jawaban salah
try / exceptMenjalankan blok except alih-alih berhenti saat kesalahan itu terjadi
  1. Baris traceback mana yang menyebut jenis kesalahan?
    • Baris pertama
    • Baris File
    • Baris terakhir
    • Baris dengan tanda ^
  2. Kesalahan apa yang disebabkan int("12a")?
    • TypeError
    • ValueError
    • NameError
    • SyntaxError
  3. Kesalahan apa yang disebabkan pritn("hi")?
    • SyntaxError
    • NameError
    • TypeError
    • Tidak ada kesalahan
  4. Program mencetak baris 1 lalu berhenti dengan kesalahan pada baris 2. Jenis kesalahan mana yang tidak mungkin menjadi penyebabnya?
    • SyntaxError
    • NameError
    • TypeError
    • ZeroDivisionError
  5. Apa yang dicetak kode ini?
    try:
        x = 10 / 0
    except ZeroDivisionError:
        x = -1
    print(x)
  6. Apa yang terjadi saat kode ini dijalankan?
    print("start")
    print(5 / 0)
    print("end")
    • Mencetak start dan end
    • Mencetak start, lalu berhenti dengan ZeroDivisionError
    • Berhenti dengan ZeroDivisionError sebelum mencetak apa pun
    • Mencetak start, inf, dan end
  7. Program berjalan tanpa pesan, tetapi mencetak jumlah yang salah. Kesalahan jenis apa itu?
    • SyntaxError
    • Kesalahan logika
    • NameError
    • IndentationError
  8. Apa yang dicetak kode ini?
    spent = {"a": 4500, "b": 10000}
    print(30000 - sum(spent.values()))
  9. Urutkan baris program kecil ini agar mencetak hasil di bawah.
    Keluaran
    80.0
  10. Di mana bug-nya? def avg(nums): return sum(nums) / len(nums), dipanggil dengan avg([]).
    • sum dari list kosong menghasilkan kesalahan
    • len([]) adalah 0, sehingga membagi dengan nol
    • return tidak boleh berisi pembagian
    • Tidak ada bug
Kesalahan umum
  • "Kesalahan ada pada baris yang disebut pesan, jadi perbaikannya di sana." Sering benar, tetapi tidak selalu. Pada unit fungsi, x = show_area(4, 3) yang diikuti x * 2 berhenti dengan TypeError pada baris x * 2. Namun, kesalahan sebenarnya adalah print dalam show_area yang seharusnya return. Baca baris yang disebut, lalu tanyakan dari mana nilainya berasal.
  • "Membungkus semuanya dalam try/except memperbaiki kesalahan." Itu hanya menyembunyikannya. Tangkap kesalahan khusus yang kamu perkirakan, seperti ValueError dari int(input()), lalu tangani dengan cara yang masuk akal.
  • "Tidak ada pesan kesalahan berarti program benar." Kesalahan logika berjalan tanpa pesan. Uji dengan masukan yang jawabannya sudah kamu ketahui, termasuk kasus tepi seperti list kosong atau usia batas.
Catatan untuk guruBiasakan pesan kesalahan. Rutinitas yang baik: sebelum memperbaiki apa pun, siswa membaca baris terakhir dengan suara keras, menyebut nomor baris, lalu menunjuk tanda ^. Program yang sengaja dirusak (satu SyntaxError, satu NameError, satu TypeError) cocok sebagai pemanasan singkat. Kurikulum informatika SMP Korea meminta siswa menganalisis hasil dengan debugger dan memperbaiki kesalahan; IDLE memiliki debugger sederhana pada menu Debug, tetapi baris print dan tabel penelusuran berfungsi sama pada tingkat ini. Proyek uang saku sesuai dengan standar berikutnya, menyelesaikan masalah kehidupan nyata dengan program, dan dapat disesuaikan menjadi anggaran camilan kelas atau catatan bacaan.
Poin penting
  • Baca traceback dari bawah: tipe kesalahan, lalu berkas dan baris, kemudian kode yang ditandai.
  • SyntaxError menghentikan program sebelum baris 1 dijalankan; kesalahan lain menghentikannya di tengah jalan.
  • try/except menangani kesalahan yang kamu perkirakan.
  • Kesalahan logika tidak memberikan pesan: telusuri dan uji dengan jawaban yang diketahui.
  • Debugging berarti sengaja merusak dan memperbaiki sampai pesan kesalahan terasa biasa.
Sumber kursus ini (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

Diperiksa: 2026-10-19