Catchers untuk Error Handling
Penjelasan
Catcher adalah cara Rocket menangani response error HTTP secara terpusat — mirip halaman error kustom, tapi didefinisikan sebagai fungsi Rust biasa yang ditandai `#[catch(status_code)]`. Kalau Rocket perlu mengembalikan status tertentu (misalnya 404 karena tidak ada route yang cocok, atau 500 karena panic di handler), Rocket mengecek apakah ada catcher terdaftar untuk status tersebut, dan memanggilnya kalau ada. Sama seperti route, semua catcher harus didaftarkan secara eksplisit lewat `.register("/", catchers![not_found, internal_error])` pada instance Rocket. Catcher juga bisa menerima parameter `req: &Request` kalau butuh detail request yang gagal (misalnya untuk mencatat path mana yang menghasilkan 404). Kalau kamu tidak mendaftarkan catcher kustom, Rocket memakai catcher DEFAULT bawaan yang mengembalikan halaman HTML sederhana — untuk API JSON, kamu hampir selalu ingin override ini supaya error tetap konsisten berformat JSON seperti response sukses lainnya.
Contoh Konsep
#[macro_use] extern crate rocket;
use rocket::Request;
use rocket::serde::json::{json, Value};
#[catch(404)]
fn not_found(req: &Request) -> Value {
json!({
"error": "tidak ditemukan",
"path": req.uri().to_string(),
})
}
#[catch(500)]
fn internal_error() -> Value {
json!({ "error": "terjadi kesalahan pada server" })
}
#[get("/")]
fn hello() -> &'static str { "Hello!" }
#[launch]
fn rocket() -> _ {
rocket::build()
.mount("/", routes![hello])
.register("/", catchers![not_found, internal_error])
}
Praktikum
Tulis catcher untuk status 401 bernama `unauthorized` yang mengembalikan JSON `{ "error": "akses ditolak" }`, lalu daftarkan.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Catcher bisa didaftarkan per-BASE PATH lewat argumen pertama `.register(base, catchers![...])` — berguna kalau kamu ingin catcher 404 yang berbeda untuk `/api/*` (mengembalikan JSON) dibanding path lain (mengembalikan HTML), tanpa perlu logic percabangan manual di dalam satu catcher.