Error Handling di Actix-web
Penjelasan
Actix-web mendukung handler yang mengembalikan `Result<T, E>`, di mana `E` mengimplementasikan trait `ResponseError`. Kalau handler mengembalikan `Err`, Actix otomatis memanggil `error_response()` dari trait tersebut untuk membangun HTTP response yang sesuai (misalnya 404 untuk data tidak ditemukan, 500 untuk error server). Pendekatan ini jauh lebih idiomatis Rust dibanding menangani semua kemungkinan error secara manual di setiap handler — kamu cukup mendefinisikan error custom sekali, lalu `?` operator bisa dipakai untuk propagasi error secara ringkas.
Contoh Konsep
use actix_web::{get, http::StatusCode, web, HttpResponse, ResponseError};
use std::fmt;
#[derive(Debug)]
enum CatatanError {
TidakDitemukan,
}
impl fmt::Display for CatatanError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Catatan tidak ditemukan")
}
}
impl ResponseError for CatatanError {
fn status_code(&self) -> StatusCode {
StatusCode::NOT_FOUND
}
fn error_response(&self) -> HttpResponse {
HttpResponse::build(self.status_code()).json("Catatan tidak ditemukan")
}
}
#[get("/catatan/{id}")]
async fn detail_catatan(path: web::Path<u32>) -> Result<HttpResponse, CatatanError> {
let id = path.into_inner();
if id == 0 {
return Err(CatatanError::TidakDitemukan);
}
Ok(HttpResponse::Ok().json("data catatan"))
}
Praktikum
Lengkapi trait implementation agar status code error diset ke NOT_FOUND.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Kalau error-mu bervariasi (validasi, database, not found), gunakan `enum` seperti contoh di atas alih-alih satu struct error generik — memudahkan `match` untuk memetakan setiap varian ke status code HTTP yang tepat.