Lewati ke isi
JRG++JRG++ v0.2.0

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:

BagianIsinya
Baris pertamaApa 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

typo.jrg
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

kurung.jrg
pub fn main() {
    wok("halo"
}
error[E0103]: harusnya ada `)` di sini, yang ketemu malah `}`
 --> kurung.jrg:3:1
  |
3 | }
  | ^
  |

Mengambil di luar jangkauan

oob.jrg
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

let-galat.jrg
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 `:=` tidak

Tipe yang tidak nyambung

tipe-galat.jrg
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.

rantai.jrg
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:9

Tiga langkah kalau kamu buntu

Baca → Persempit → Coba
1. Baca seluruh pesan, termasuk baris bantuan:
2. Persempit — hapus separuh kode sampai galatnya hilang; sisanya itu penyebabnya
3. Coba di editor praktik di pojok kanan bawah halaman ini

Kuis 1

Kalau penunjuk ^ mengarah ke }, biasanya yang salah di mana?

Kuis 2

Kenapa pesan galat menyebut tipe, bukan isi datanya?

Kuis 3

Langkah paling ampuh saat buntu mencari penyebab galat?

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.

Petunjuk: menebak sebelum menjalankan adalah latihan terbaik — kalau tebakanmu meleset, kamu baru saja menemukan sesuatu yang belum kamu pahami.