Lewati ke konten

5. Error & Testing

Go tidak punya try/catch. Fungsi yang bisa gagal mengembalikan error sebagai nilai terakhir, dan pemanggil wajib memeriksanya:

angka, err := strconv.Atoi("sepuluh")
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println(angka * 2)
error: strconv.Atoi: parsing "sepuluh": invalid syntax

Pola if err != nil { ... } akan sangat sering kamu tulis. nil artinya “tidak ada error”.

import "errors"
func Bagi(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("tidak bisa membagi dengan nol")
}
return a / b, nil
}

Butuh pesan dengan nilai di dalamnya? Pakai fmt.Errorf("port %d sudah dipakai", port).

Beberapa kesalahan membuat program langsung berhenti (panic), misalnya membagi dengan nol atau mengakses indeks slice di luar batas:

panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.main()

Panic berarti ada bug. Kode yang baik memeriksa kondisinya lebih dulu dan mengembalikan error.

Test ditulis di file berakhiran _test.go, berisi fungsi TestXxx(t *testing.T):

bagi_test.go
package main
import "testing"
func TestBagiNol(t *testing.T) {
_, err := Bagi(1, 0)
if err == nil {
t.Error("Bagi(1, 0) seharusnya mengembalikan error")
}
}
Perintah Fungsi
go test jalankan semua test, tampilkan yang gagal saja
go test -v tampilkan setiap test (=== RUN, --- PASS)
go test -run Nol hanya test yang namanya cocok dengan Nol

t.Error / t.Errorf menandai test gagal tapi lanjut; t.Fatal menghentikan test itu saat itu juga.

Kalkulator di lab ini punya bug yang membuatnya panic. Temukan lewat test, lalu perbaiki.

Lab: Kalkulator: error & testing
Misi 0/7
  1. Masuk ke kalkulator dan hitung 10 / 2 dengan go run . 10 2.
    Petunjukcd kalkulator && go run . 10 2
  2. Beri input bukan angka: go run . sepuluh 2. Error dari strconv.Atoi ditangani dengan rapi.
    Petunjukgo run . sepuluh 2
  3. Sekarang bagi dengan nol: go run . 1 0. Programnya panic!
    Petunjukgo run . 1 0
  4. Jalankan unit test dengan go test. Satu test gagal.
    Petunjukgo test
  5. Perbaiki Bagi di bagi.go: kalau b == 0, kembalikan errors.New(...). Jalankan go test sampai ok.
    Petunjukimport "errors" ; if b == 0 { return 0, errors.New("tidak bisa membagi dengan nol") }
  6. Lihat detail tiap test dengan go test -v.
    Petunjukgo test -v
  7. Coba lagi go run . 1 0 — sekarang yang muncul pesan error, bukan panic.
    Petunjukgo run . 1 0