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
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)Traceback (most recent call last):
File "main.py", line 3, in <module>
print(total / count)
~~~~~~^~~~~~~
ZeroDivisionError: division by zeroMulai 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.
| Kesalahan | Penyebab umum | Contoh |
|---|---|---|
| SyntaxError | Baris bukan Python yang sah: kurung, titik dua, atau tanda kutip kurang | print("hi" |
| IndentationError | Inden tidak ada atau tidak seragam | if x > 1: tanpa baris berinden |
| NameError | Nama yang belum ada, sering akibat salah ketik | pritn("hi") |
| TypeError | Operasi pada tipe yang salah | "Age: " + 15 |
| ValueError | Tipe benar, nilai tidak mungkin digunakan | int("abc") |
| IndexError | Indeks melewati akhir list atau string | [1, 2][2] |
| KeyError | Kunci tidak ada dalam dictionary | {"a": 1}["b"] |
| ZeroDivisionError | Membagi dengan nol | 5 / 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")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)0Bug 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")snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half leftSebelum 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.
| traceback | Laporan kesalahan Python; baca dari bawah |
| SyntaxError | Kode tidak sah, ditemukan sebelum apa pun dijalankan |
| NameError | Nama yang tidak ada, sering akibat salah ketik |
| TypeError | Operasi pada tipe nilai yang salah |
| ValueError | Tipe benar dengan nilai yang tidak mungkin digunakan, seperti int("abc") |
| kesalahan logika | Berjalan tanpa pesan tetapi memberikan jawaban salah |
| try / except | Menjalankan blok except alih-alih berhenti saat kesalahan itu terjadi |
- Baris traceback mana yang menyebut jenis kesalahan?
- Baris pertama
- Baris File
- Baris terakhir
- Baris dengan tanda ^
- Kesalahan apa yang disebabkan
int("12a")?- TypeError
- ValueError
- NameError
- SyntaxError
- Kesalahan apa yang disebabkan
pritn("hi")?- SyntaxError
- NameError
- TypeError
- Tidak ada kesalahan
- Program mencetak baris 1 lalu berhenti dengan kesalahan pada baris 2. Jenis kesalahan mana yang tidak mungkin menjadi penyebabnya?
- SyntaxError
- NameError
- TypeError
- ZeroDivisionError
- Apa yang dicetak kode ini?
try: x = 10 / 0 except ZeroDivisionError: x = -1 print(x) - 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
- Program berjalan tanpa pesan, tetapi mencetak jumlah yang salah. Kesalahan jenis apa itu?
- SyntaxError
- Kesalahan logika
- NameError
- IndentationError
- Apa yang dicetak kode ini?
spent = {"a": 4500, "b": 10000} print(30000 - sum(spent.values())) - Urutkan baris program kecil ini agar mencetak hasil di bawah.Keluaran
80.0 - 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 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.
- 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