Error Handling
Penjelasan
Vapor menyediakan tipe Abort untuk melempar error yang otomatis diterjemahkan jadi HTTP response dengan status code yang sesuai, misalnya Abort(.notFound) untuk 404, Abort(.badRequest, reason: "Pesan khusus") untuk 400 dengan pesan detail, atau Abort(.unauthorized) untuk 401. Karena Abort adalah Error biasa, cukup throw dari handler yang ditandai throws (atau async throws) — Vapor menangkapnya di level global lewat ErrorMiddleware dan mengubahnya jadi response JSON standar berisi error: true dan reason. Untuk error kustom yang lebih terstruktur dari sekadar status+pesan, kamu bisa membuat enum/struct sendiri yang conform ke protocol AbortError, mendefinisikan property status dan reason sendiri sesuai kebutuhan domain aplikasi.
Contoh Konsep
import Fluent
import Vapor
func routes(_ app: Application) throws {
app.get("catatan", ":id") { req async throws -> Catatan in
guard let id = req.parameters.get("id", as: UUID.self) else {
throw Abort(.badRequest, reason: "ID tidak valid")
}
guard let catatan = try await Catatan.find(id, on: req.db) else {
throw Abort(.notFound, reason: "Catatan tidak ditemukan")
}
return catatan
}
}
Praktikum
Buat route app.get("pengguna", ":id") yang mem-parse id sebagai UUID (throw Abort(.badRequest) kalau gagal), mencari Pengguna lewat Pengguna.find(id, on: req.db), dan throw Abort(.notFound, reason: "Pengguna tidak ditemukan") kalau nil.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Jangan menangkap semua error secara generik dan mengembalikan 500 untuk semuanya — pakai status code yang tepat (400 untuk input salah, 404 untuk data tidak ada, 401/403 untuk masalah autentikasi/otorisasi) supaya client bisa menangani tiap kasus dengan benar.