10. Membaca pesan error

Ketika sebuah program salah, Lua tidak diam saja — ia mencetak sebuah pesan error dan berhenti. Pemula melihat teks merah itu sebagai sesuatu yang menakutkan dan langsung mulai mengubah-ubah sesuatu secara asal. Tapi itu bukan sekadar teks acak: Lua sedang memberi tahu kamu tepat di baris mana yang harus dilihat, dan memberi petunjuk apa yang salah. Bab ini mengajarkan kamu cara membacanya.

Bentuk sebuah error

Hampir semua error di Lua punya bentuk yang sama:

lua: file.lua:BARIS: pesan

Tiga bagian, dan kamu membacanya dalam urutan ini:

  1. Nomor baris (file.lua:3 berarti baris 3). Lihat ke sana dulu. Selalu.
  2. Pesan — deskripsi singkat tentang apa yang salah.
  3. Kadang ada stack traceback di bawahnya. Sebagai pemula, abaikan saja traceback-nya; baris pertama sudah berisi yang kamu butuhkan.

Empat error yang pasti kamu temui

Keempat ini mencakup sebagian besar kesalahan di awal belajar. Belajarlah mengenali mereka dengan cepat.

Unfinished string

Kamu lupa menutup tanda kutip.

print("hi)
lua: hello.lua:1: unfinished string near '"hi)'

"Unfinished string" berarti Lua menemukan tanda kutip pembuka tapi sampai ke akhir baris tanpa menemukan tanda kutip penutup. Cara memperbaiki: tambahkan " yang kurang.

Attempt to call a nil value

Kamu salah mengeja nama fungsi.

prnt("hi")
lua: hello.lua:1: attempt to call a nil value (global 'prnt')

Lua sedang bilang: kamu mencoba memanggil prnt, tapi tidak ada hal seperti itu, jadi nilainya nil, dan kamu tidak bisa memanggil nil. Nama di antara tanda kutip ('prnt') adalah kata yang salah eja. Cara memperbaiki: tulis print dengan benar.

Attempt to concatenate a nil value

Kamu menyambungkan .. ke sesuatu yang tidak punya nilai.

print("score: " .. nil)
lua: hello.lua:2: attempt to concatenate a nil value

Sesuatu di salah satu sisi .. bernilai nil — sering kali variabel yang belum pernah diberi nilai, atau namanya salah eja. Cara memperbaiki: pastikan kedua sisi memiliki string atau angka.

'end' expected

Kamu membuka sebuah if, for, while, atau function tapi tidak pernah menutupnya.

if x > 3 then
  print("big")
lua: hello.lua:3: 'end' expected (to close 'if' at line 1) near <eof>

Yang ini cukup membantu: ia memberi tahu kamu blok mana yang belum ditutup dan di baris berapa ia dimulai (to close 'if' at line 1). <eof> berarti "end of file" — Lua sudah sampai di akhir file tapi masih menunggu end. Cara memperbaiki: tambahkan end.

Siklus edit-jalankan-perbaiki

Cara yang benar untuk menangani error bukan dengan mencari semuanya sekaligus lewat mata, melainkan dengan menjalankan siklus yang ketat:

  1. Jalankan file.
  2. Baca error pertama: nomor baris, lalu pesannya.
  3. Perbaiki satu hal itu saja.
  4. Jalankan lagi.

Ulangi sampai program berjalan tanpa masalah. Jangan perbaiki tiga hal sekaligus — salah satu "perbaikan" mungkin keliru, dan kamu tidak bisa tahu perubahan mana yang berhasil. Satu error, satu perbaikan, jalankan lagi.

Satu kesalahan kadang menghasilkan pesan yang membingungkan, atau menunjuk ke baris setelah masalah sebenarnya (sebuah end yang hilang sering dilaporkan di akhir file). Kalau baris yang disebutkan terlihat sudah benar, cek baris tepat di atasnya.

Buka exercises/10/01-three-bugs.lua. File itu tidak bisa dijalankan. Gunakan siklus edit-jalankan-perbaiki: jalankan, baca error pertama, perbaiki hanya itu, lalu jalankan lagi. Terus lakukan sampai program mencetak All fixed!.

Error bukan berarti gagal

Setiap programmer membaca pesan error setiap hari. Itu bukan tanda bahwa kamu tidak berbakat — itu adalah bolak-balik yang normal dalam menulis kode. Membaca error dengan tenang hanya berarti kamu sudah membaca beberapa ribu di antaranya. Kamu sedang dalam perjalanan ke sana.

PR

File-file PR ada di exercises/10/homework/.

Soal 1 — Sebutkan jenis error-nya

Buka exercises/10/homework/01-name-the-error.lua. File itu berisi satu baris yang rusak. Jalankan, baca pesannya, dan (dalam sebuah komentar di bagian bawah) tulis mana dari empat jenis error di bab ini yang sesuai. Lalu perbaiki.

Soal 2 — Perbaiki tanda kutip

Buka exercises/10/homework/02-fix-the-quote.lua. File itu punya unfinished string. Perbaiki supaya program mencetak kutipannya dalam satu baris.

Soal 3 — Perbaiki typo

Buka exercises/10/homework/03-fix-the-typo.lua. Sebuah nama fungsi salah eja, menghasilkan error "attempt to call a nil value". Perbaiki.

Tantangan — Tiga sekaligus

Buka exercises/10/homework/04-three-in-a-row.lua. File itu punya tiga kesalahan terpisah, masing-masing satu jenis: unfinished string, print yang salah eja, dan end yang hilang. Perbaiki satu per satu, jalankan setelah setiap perbaikan, sampai file mencetak:

done

Mentok atau sudah selesai? Buka halaman solusi PR.