For the complete documentation index, see llms.txt. This page is also available as Markdown.

Error Handler

Setelah memiliki standard response, langkah selanjutnya adalah menyempurnakan cara kita menangani error. Tidak semua error adalah "Internal Server Error". Client perlu tahu apakah error terjadi karena:

  • Input tidak valid (Bad Request)

  • Data tidak ditemukan (Not Found)

  • Tidak punya akses (Forbidden)

  • Belum login (Unauthorized)

Bab ini akan membangun sistem error handling yang konsisten dan informatif.

📂 Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:

🔗 github.com/jacky-htg/workshop/tree/main/13-error-handler

13.1 Masalah dengan Error Handling Saat Ini

Saat ini, semua error dari service langsung dibungkus menjadi InternalServerError:

// Sebelumnya
if err != nil {
    response.SetError(u.log, w, http.StatusInternalServerError, 
        response.AppBusinessStatusError, err, "Failed to list users")
    return
}

Masalah:

  • Error "user not found" juga dianggap Internal Server Error (seharusnya 404)

  • Client tidak bisa membedakan jenis error

  • Tidak ada kode error standar untuk frontend

13.2 Desain Custom Error

Kita akan membuat custom error type yang mengimplementasikan interface error bawaan Go:

Contoh error yang akan dihasilkan:

Skenario
Code
HTTP Status
Message

Input tidak valid

E001

400

"Invalid input"

Data tidak ditemukan

E002

404

"Resource not found"

Akses ditolak

E003

403

"Forbidden"

Belum login

E004

401

"Unauthorized"

Error internal

E000

500

"Internal Server Error"

13.3 Implementasi Custom Error

Buat file pkg/errors/errors.go:

13.4 Update Response Helper

Sederhanakan SetError untuk menerima *BusinessError langsung:

13.5 Update Service Layer dengan BusinessError

Setiap error di repository bisa dipertahankan karena error di repository tidak akan ditampilkan sebagai reponse dan hanya disimpan dalam log. Namun error di level service dan handler harus diubah mengikuti bisnis error yang telah ditentukan.

Service layer sekarang mengembalikan *errors.BusinessError:

13.6 Update Handler Layer

Handler sekarang jauh lebih bersih:

13.7 Aliran Error dari Repository ke Client

Berikut diagram aliran error:

13.8 Contoh Response Error Setelah Implementasi

Error Not Found (404)

Error Invalid Input (400)

Error Internal Server (500)

Ringkasan Bab 13

Di bab ini kita telah belajar:

Konsep
Implementasi

Custom Error Type

BusinessError dengan Code, Message, HTTPStatus

Error Wrapping

Menggunakan %w dan Unwrap()

Error Constructors

InvalidInput(), NotFound(), Forbidden(), dll

Error Extraction

GetBusinessError() dengan errors.As()

Handler Simplification

Handler hanya panggil SetError(w, err)

Manfaat yang kita peroleh:

  • ✅ Client bisa membedakan jenis error berdasarkan status code dan kode error

  • ✅ Pesan error konsisten dan user-friendly

  • ✅ Error handling logic terpusat (tidak tersebar)

  • ✅ Mudah menambahkan jenis error baru

  • ✅ Error original tetap terjaga untuk logging (via Unwrap())

Yang akan datang:

  • Saat ini context hanya menggunakan context.Background()

  • Bab selanjutnya: Context – memanfaatkan context untuk request-scoped values, timeout, dan cancellation

Last updated