Custom Exception Handler Pada Spring Boot
Penangangan error atau exception handling merupakan hal yang tidak boleh luput dari pembuatan aplikasi, apapun itu. Karena kita tidak ingin pengguna mendapatkan pengalaman yang tidak baik terhadap aplikasi kita.
Contoh simpel, pada aplikasi Android ada yang pernah mengalami error Force closed? Apakah setelah muncul pop-up masih bisa menggunakan aplikasinya? Tentu tidak, langsung keluar begitu saja. Proses bisnis berhenti.
Beberapa hal yang dapat terpengaruh dari tidak adanya penanganan error pada aplikasi, antara lain:
1. User Experience / Pengalaman Pengguna
Tidak ada pengguna yang menggunakan aplikasi atau website yang rusak. Buat apa meng-install aplikasi atau membuka website yang tidak bisa dibuka? Hal ini membuat pengguna merasakan pengalaman buruk terhadap aplikasi atau website kita. Dengan tidak adanya penanganan error yang baik, pengguna hanya akan mendapatkan pesan yang tidak dapat dimengerti atau kurang informatif. Relatif membuat pengguna bingung apa yang terjadi, apa yang salah, dan apa yang harus dilakukan. Apakah pengguna masih ingin menggunakan? Mungkin ya, mungkin tidak.
2. Proses Bisnis
Error hanya akan menghambat proses bisnis. Dengan hambatan ini, pengguna tidak dapat menggunakan aplikasi atau website dengan maksimal bahkan bisa jadi tidak dapat digunakan sama sekali. Pengguna tidak dapat menggunakan, artinya tidak ada transaksi yang akan berjalan. Kerugian besar bisa saja terjadi.
Bayangkan sebuah marketplace, dimana setelah pengguna mencari barang yang ingin dibeli ternyata terjadi error yang tidak dapat dimengerti oleh pengguna. Bukannya untung, malah buntung. Pengguna bisa saja tidak jadi membeli barang tersebut.
3. Integritas
Lanjutan dari poin nomor 2, apabila pengguna tidak jadi membeli di marketplace Anda. Bisa jadi mereka akan mencari di marketplace lain. Dan yaah… Netizen kadang jempolnya ngeri, laporan error bukannya dilaporkan ke Customer Service malah disebarluaskan ke media sosial. Integritas layanan kita bisa jadi akan dipertanyakan.
Nah, pada kesempatan kali ini kita akan membahas bagaimana menangani error pada web framework berbasis JVM, Spring Boot. Ketika membuat aplikasi Backend, kita diharuskan bisa memperkirakan error apa saja yang kemungkinan akan terjadi ketika kita coding.
Spring Boot sudah menyediakan sebuah middleware, apabila terjadi exception tidak akan mengeluarkan stacktrace error melainkan default error response dalam bentuk JSON, seperti dibawah ini
{
"timestamp": "2023-05-12T03:12:00.163+00:00",
"status": 500,
"error": "Internal Server Error",
"path": "/sample/div"
}
Namun pada beberapa perusahaan, default response diatas kurang informatif. Aplikasi tidak menjelaskan error apa yang terjadi. Sehingga kita harus merubah format error diatas supaya lebih informatif dan atau sesuai kebutuhan kita. Misal mau dibuat seperti dibawah ini
{
"status": "ERROR",
"data": null,
"meta": {
"code": 400,
"message": "Username dan Password tidak tepat",
"debugInfo": null
}
}
Konsep dasarnya sama seperti try-catch, dimana apabila ada error yang terjadi di block try, akan ditangkap dan menjalankan kode pada block catch. Namun pada Spring Boot, proses penangkapan dilakukan di middleware. Kita tinggal membuat middleware untuk menangkap dan membuat model response yang kita inginkan.
Membuat Custom Exception Handler
Untuk menangkap error yang terjadi di Spring Boot, kita bisa membuat custom class ber-extensi ResponseEntityExceptionHandler. Pada dasarnya, class ResponseEntityExceptionHandler memiliki beberapa method yang bisa kita override, khususnya error-error yang berhubungan dengan web service, seperti:
- handleHttpMediaTypeNotSupported(…)
- handleMethodArgumentNotValid(…)
- handleMissingServletRequestParameter(…)
- Dan lain-lain. Lengkapnya bisa dilihat disini.
Namun untuk exception bawaan Java seperti Exception, RuntimeException, AritmethicException, dan lain lain. Kita bisa tangkap dengan menambahkan anotasi @ExceptionHandler.
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> exception(Exception exception) {
String message = exception.getLocalizedMessage();
return new ResponseEntity<>(message, HttpStatus.BAD_REQUEST);
}
Jangan lupa untuk menambahkan anotasi @ControllerAdvice. Merupakan anotasi spesialisasi dari @Component yang berfungsi sebagai interceptor exception pada kelas-kelas atau method-method yang ber-anotasi @RequestMapping dan sejenisnya.
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> exception(Exception exception) {
String message = exception.getLocalizedMessage();
return new ResponseEntity<>(message, HttpStatus.BAD_REQUEST);
}
}
Membuat Model Response Error
Pada dasarnya, API yang dibuat menggunakan Spring Boot akan berbentuk JSON. Maka untuk meng-custom response error, kita harus membuat model kelas untuk menampung informasi yang ingin ditampilkan dari error.
public class ResponseModel {
private String status;
private Object data;
private String error;
// setter - getter
}
Kemudian ubah ExceptionHandler yang sudah dibuat tadi supaya menggunakan ResponseModel pada mekanisme response-nya.

Contoh project, bisa dilihat di repo github dibawah ini.
Github.com/custom-exception-handler
Penutup
Membuat aplikasi yang reliable, secure, dan performa tinggi merupakan hal wajib dan dasar dalam software engineering. Namun, memberikan pesan yang mudah dipahami oleh user juga merupakan hal yang esensial. Custom exception handler bisa digunakan untuk memberikan informasi yang mudah dipahami oleh user dan juga bagi tim internal misalnya memberikan log info yang bisa digunakan untuk tracing error atau behavior aplikasi.