Pesan error adalah bagian kehidupan programmer yang tidak bisa dihindari, dan pemula sering memandangnya sebagai kegagalan. Pada Rust, sudut pandang tersebut perlu dibalik: diagnostik kompilator Rust dirancang seperti guru privat yang menjelaskan apa yang salah, di mana letaknya, dan bagaimana cara memperbaikinya. Membaca pesan tersebut secara sistematis adalah keterampilan yang melindungi kita berbulan-bulan ke depan. Pada Chapter ini kita akan memicu beberapa galat secara sengaja, lalu membedah struktur pesannya satu per satu.
Anatomi Sebuah Pesan Error #
Masalah yang paling sering menimpa pemula adalah mencampur tipe data: misalnya memasukkan teks ke variable yang diharapkan berisi bilangan. Kompilator Rust memeriksa kesesuaian tipe seluruh program pada saat kompilasi — sebelum satu baris kode pun dijalankan — sehingga kesalahan seperti ini tidak pernah lolos menjadi bug runtime. Mari kita buktikan dengan proyek baca_error:
cargo new baca_error
cd baca_errorUbah isi src/main.rs menjadi:
fn main() {
let total: i32 = "seratus";
}Jalankan cargo build, maka kompilasi gagal dengan pesan berikut:
Compiling baca_error v0.1.0 (/tmp/baca_error)
error[E0308]: mismatched types
--> src/main.rs:2:22
|
2 | let total: i32 = "seratus";
| --- ^^^^^^^^^ expected `i32`, found `&str`
| |
| expected due to this
For more information about this error, try `rustc --explain E0308`.
error: could not compile `baca_error` (bin "baca_error") due to 1 previous errorPesan tersebut terlihat panjang, tetapi setiap bagiannya punya fungsi yang tetap. Mari kita petakan komponennya:
- Baris
error[E0308]: mismatched types: level pesan (errorberarti kompilasi gagal), kode error (E0308), dan judul ringkas masalahnya (mismatched typesatau tipe tidak cocok). - Baris
--> src/main.rs:2:22: lokasi galat dalam formatberkas:baris:kolom. Kompilator menunjuk baris ke-2, kolom ke-22 — tepat pada nilai"seratus". - Cuplikan kode dengan penanda: kompilator menyalin baris bermasalah, lalu menandai bagian yang dicurigai. Tanda
^^^^^^^^^menunjuk nilai"seratus", sedangkan garis---di bawahi32menunjuk tipe yang kita deklarasikan. - Baris penjelasan
expected ... found ...: inti masalah — kompilator mengharapkan bilangan bulati32, tetapi menemukan string&str. Dari satu baris ini kita sudah tahu perbaikannya: berikan nilai bilangan, atau ganti anotasi tipe menjadi&str. - Baris
expected due to this: penjelasan mengapa kompilator mengharapkani32— karena anotasi tipe yang kita tulis sendiri. - Baris
could not compile ... due to 1 previous error: ringkasan akhir berisi jumlah galat. Angka ini berguna pada program besar: kita tahu ada berapa masalah yang harus diselesaikan.
Membuka Penjelasan dengan rustc –explain #
Baris For more information about this error, try "rustc --explain E0308" bukan basa-basi. Kompilator menyimpan dokumentasi bawaan untuk setiap kode error, dan kita dapat membukanya tanpa membuka peramban:
rustc --explain E0308Potongan output yang Dihasilkan:
Expected type did not match the received type.
Erroneous code examples:
```
fn plus_one(x: i32) -> i32 {
x + 1
}
plus_one("Not a number");
// ^^^^^^^^^^^^^^ expected `i32`, found `&str`
```
This error occurs when an expression was used in a place where the compiler
expected an expression of a different type.Dokumentasi tersebut memuat penjelasan penyebab galat dan contoh kode salah yang dianotasi — persis seperti pesan error, tetapi dengan narasi lebih lengkap. Kebiasaan menjalankan --explain saat menemui kode error asing mempercepat pemahaman kita terhadap aturan bahasa.
Warning Tidak Menghentikan Build #
Warning adalah saudara error yang lebih lembut: kompilator menemukan kejanggalan, tetapi program tetap valid sehingga build dilanjutkan. Kasus klasiknya adalah variable yang dibuat tetapi tidak pernah dipakai. Ganti src/main.rs menjadi:
fn main() {
let nama = "Budi";
println!("Halo semuanya!");
}Jalankan cargo build:
Compiling baca_error v0.1.0 (/tmp/baca_error)
warning: unused variable: `nama`
--> src/main.rs:2:9
|
2 | let nama = "Budi";
| ^^^^ help: if this is intentional, prefix it with an underscore: `_nama`
|
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) is on by default
warning: `baca_error` (bin "baca_error") generated 1 warning (run `cargo fix --bin "baca_error" -p baca_error` to apply 1 suggestion)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.06sStruktur pesannya serupa dengan error: level (warning), lokasi, cuplikan kode, dan penjelasan. Bedanya pada akhir proses: baris Finished tetap muncul karena binary berhasil dibuat. Warning semacam ini biasanya menandakan dua kemungkinan — variable nama memang lupa dipakai (perbaiki dengan memakainya), atau sengaja disimpan untuk nanti (tulis ulang namanya menjadi _nama agar kompilator paham).
Membaca Saran Perbaikan #
Kesalahan Nama Variable #
Typo adalah galat paling sering terjadi sepanjang karier programming. Kompilator Rust tidak hanya mendeteksi nama yang tidak dikenal, tetapi juga menebak nama yang kita maksud. Ganti src/main.rs:
fn main() {
let nama = "Budi";
println!("Halo, {}", nma);
}Output cargo build:
Compiling baca_error v0.1.0 (/tmp/baca_error)
error[E0425]: cannot find value `nma` in this scope
--> src/main.rs:3:26
|
3 | println!("Halo, {}", nma);
| ^^^
|
help: a local variable with a similar name exists
|
3 | println!("Halo, {}", nama);
| +
For more information about this error, try `rustc --explain E0425`.
error: could not compile `baca_error` (bin "baca_error") due to 1 previous errorBagian help: adalah saran perbaikan. Kompilator menemukan variable nama yang mirip dengan nma, lalu menampilkan versi baris yang sudah dibetulkan lengkap dengan tanda + yang menandai karakter yang perlu ditambahkan. Mengikuti saran tersebut — mengganti nma menjadi nama — membuat program lolos kompilasi dan berjalan:
Compiling baca_error v0.1.0 (/tmp/baca_error)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/baca_error`
Halo, BudiTitik Koma yang Hilang #
Satu kasus lagi yang wajib kita kenali: lupa menutup pernyataan dengan titik koma. Uji dengan kode berikut:
fn main() {
let greeting = "Halo"
println!("{}", greeting);
}Output cargo build:
Compiling baca_error v0.1.0 (/tmp/baca_error)
error: expected `;`, found `println`
--> src/main.rs:2:26
|
2 | let greeting = "Halo"
| ^ help: add `;` here
3 | println!("{}", greeting);
| ------- unexpected token
error: could not compile `baca_error` (bin "baca_error") due to 1 previous errorPesan ini memperlihatkan pola expected … found …: kompilator mengharapkan titik koma setelah string "Halo", tetapi menemukan token println milik baris berikutnya. Saran add ";" here bahkan menandai posisi persis tempat titik koma harus diletakkan. Perhatikan bahwa galat pada baris 2 baru terdeteksi ketika kompilator membaca baris 3 — penanda lokasi mengarah ke akhir baris 2, dan itu normal terjadi pada galat sintaks.
Ringkasan #
Diagnostik Rust mengikuti struktur tetap: level (error atau warning), kode error opsional, lokasi berkas:baris:kolom, cuplikan kode dengan penanda, penjelasan penyebab, dan saran perbaikan. Kode error dapat digali lebih dalam dengan rustc --explain, warning tidak menghentikan build namun wajib dibaca, dan saran help: sering kali memuat perbaikan siap pakai. Daripada takut pada pesan merah, kita kini membacanya seperti peta menuju kode yang benar — dan sebelum menutup section ini, kita pelajari satu perkakas terakhir: rustup, pengelola toolchain yang menjaga Rust kita tetap mutakhir.