JRG 12 · JRG Lanjut
Membaca Pesan Galat
Keterampilan yang paling cepat membuatmu mandiri. Semua pesan di bab ini diambil langsung dari JRG — bukan ditulis ulang.
mandiriGalat bukan tanda kamu gagal
Pesan galat adalah satu-satunya bagian bahasa pemrograman yang benar-benar mengajar. Ia tahu persis apa yang salah dan di mana. Yang perlu kamu lakukan cuma membacanya sampai selesai — kebanyakan orang berhenti di baris pertama.
Setiap galat JRG punya empat bagian:
| Bagian | Isinya |
|---|---|
| Baris pertama | Apa yang salah, dalam bahasa sehari-hari |
--> | Berkas, baris, dan kolom |
Cuplikan + ^ | Potongan kodemu, dengan penunjuk tepat di bawahnya |
bantuan: | Saran perbaikan, kalau JRG punya |
Salah ketik nama
pub fn main() {
let jumlah = 10
wok(jumlas)
}error: variabel `jumlas` belum dikenal — maksudnya `jumlah`? kalau bukan, cek lagi penulisannya atau jangan-jangan lupa `let jumlas = ...` dulu
--> typo.jrg:3:9
|
3 | wok(jumlas)
| ^^^^^^
|Kurung yang belum ditutup
pub fn main() {
wok("halo"
}error[E0103]: harusnya ada `)` di sini, yang ketemu malah `}`
--> kurung.jrg:3:1
|
3 | }
| ^
|Mengambil di luar jangkauan
pub fn main() {
let a = [10, 20, 30]
wok(a[7])
}error: index [7] di luar batas — array ini isinya 3 elemen (index valid: 0..2, atau -1..-3 kalau mau hitung dari belakang)
--> oob.jrg:3:9
|
3 | wok(a[7])
| ^^^^
|Perhatikan bahwa pesannya menyebut panjang sebenarnya. Itu biasanya langsung memberitahumu penyebabnya: penghitung yang kelebihan satu, atau data yang lebih pendek dari dugaan.
Mengubah nilai yang tidak boleh diubah
pub fn main() {
let batas = 100
batas = 200
}error[E0103]: `batas` dideklarasikan dengan `let`, jadi ia tidak bisa ditugasi ulang.
--> let-galat.jrg:3:5
|
3 | batas = 200
| ^^^^^
|
= bantuan: pakai `var` atau `let mut` kalau nilainya memang harus berubah
= catatan: `let` dan `const` mengikat nilainya; `var` dan `:=` tidakTipe yang tidak nyambung
pub fn main() {
wok(5 % "dua")
}error: tidak bisa `%` antara `int` dan `string`
--> tipe-galat.jrg:2:9
|
2 | wok(5 % "dua")
| ^^^^^^^^^
|Galat yang muncul saat berjalan
Sebagian galat baru ketahuan ketika program sudah jalan — misalnya pembagian nol yang angkanya baru diketahui belakangan. JRG menyebutkan rantai pemanggilan yang membawanya ke situ.
fn bagi(a: int, b: int) -> int {
return a / b
}
fn hitungRata(total: int, banyak: int) -> int {
return bagi(total, banyak)
}
pub fn main() {
wok(hitungRata(100, 0))
}error: `100 / 0` — nggak bisa bagi dengan nol, hasilnya nggak pernah terdefinisi. Cek lagi angka pembaginya sebelum dipakai bagi
--> rantai.jrg:2:12
|
2 | return a / b
| ^^^^^
|
= jejak: `bagi` dipanggil di rantai.jrg:6:12
`hitungRata` dipanggil di rantai.jrg:10:9Tiga langkah kalau kamu buntu
bantuan:Kuis 1
Kalau penunjuk ^ mengarah ke }, biasanya yang salah di mana?
Tepat. JRG baru sadar ada yang kurang saat menemukan tanda yang tidak cocok.
Pikirkan kapan JRG bisa tahu bahwa ada kurung yang kurang.
Kuis 2
Kenapa pesan galat menyebut tipe, bukan isi datanya?
Betul — pesan yang panjangnya mengikuti besar data akan menenggelamkan keterangannya sendiri.
Bayangkan pesan galat untuk array berisi sepuluh ribu angka.
Kuis 3
Langkah paling ampuh saat buntu mencari penyebab galat?
Tepat — ini disebut membagi dua, dan ia bekerja untuk hampir semua bug.
Yang dicari adalah cara mempersempit, bukan mengubah.
Latihan mandiri
1. Buat program yang sengaja salah, lalu tebak dulu galat apa yang akan muncul sebelum menjalankannya.
2. Ambil satu pesan galat di bab ini, dan tunjukkan baris mana yang harus diperbaiki.