Best Practice Error Handling di Backend
Photo by Kostiantyn Li on Unsplash
Error itu pasti terjadi—entah karena input user yang salah, koneksi gagal, atau bug yang lolos. Masalah utamanya bukan error-nya, tapi bagaimana kamu menanganinya.
Catatan : Contoh-contoh kode di artikel ini menggunakan bahasa PHP, tetapi kamu dapat mengimplementasikannya di bahasa pemrograman lain sesuai kebutuhan.
Berikut best practice error handling di backend yang wajib kamu terapkan.
1. Tangani Error dengan Benar, Jangan Biarkan Lewat Tanpa Jejak
⚠️ Jangan Diam-Diam Telan Exception
Hindari kode seperti ini:
try {
// sesuatu yang bisa gagal
} catch (Exception $e) {
// sengaja dikosongkan 🙃
}
Ini bikin proses debugging jadi jauh lebih sulit. Sebaiknya log error-nya :
catch (Exception $e) {
$logId = uniqid('pay_');
Log::error('Gagal memproses pembayaran', [
'log_id' => $logId,
'user_id' => auth()->id(),
'error' => $e->getMessage()
]);
return response()->json([
'status' => 'error',
'message' => 'Terjadi kesalahan saat memproses pembayaran. Silakan coba lagi nanti.',
'log_id' => $logId,
'error_code' => 'PAYMENT_FAILED'
], 500);
}
2. Gunakan HTTP Status Code yang Tepat
Setiap error punya kode-nya sendiri. Jangan kembalikan 200 OK kalau data tidak ditemukan. Contoh:
| Situasi | Kode yang Benar |
|---|---|
| Data tidak ditemukan | 404 Not Found |
| Request tidak valid | 400 Bad Request |
| Gagal otorisasi | 401 Unauthorized |
| Error internal server | 500 Internal Server Error |
3. Sertakan Error Code di Response
Selain status code, tambahkan error_code khusus di response. Ini memudahkan FE atau mobile dev untuk handling:
{
"status": "error",
"error_code": "PAYMENT_TIMEOUT",
"message": "Pembayaran gagal karena timeout"
}
Dengan begini, frontend bisa tahu error PAYMENT_TIMEOUT harus ditampilkan dengan UI tertentu.
4. Sediakan Fallback untuk Critical Flow
Ada proses yang harus tetap jalan walau ada error. Misalnya:
- Gagal kirim email? Simpan ke queue untuk dicoba lagi nanti.
- Gagal simpan ke Redis? Simpan ke database sebagai fallback.
- Payment error? Jangan langsung cancel order, tandai sebagai “pending”.
Contoh:
try {
// Coba kirim email
Mail::to($email)->send(new YourMailable());
} catch (Exception $err) {
// Log error dan coba simpan ke antrean retry
Log::error('Gagal kirim email, akan dicoba ulang', ['err' => $err->getMessage()]);
try {
// Simpan ke antrean retry
saveToRetryQueue($emailData);
} catch (Exception $fallback) {
// Jika fallback gagal, log critical error
Log::critical('Gagal menyimpan ke antrean retry', ['err' => $fallback->getMessage()]);
}
}
Kesimpulan
Dengan menerapkan best practice error handling di backend, kamu bukan cuma mencegah error kecil jadi bencana, tapi juga bikin sistemmu jauh lebih stabil dan developer-friendly.
Catatan: Artikel ini terinspirasi dari postingan Mayank A. di LinkedIn yang membahas tentang best practices dalam software development. Kamu bisa baca versi aslinya di sini.