Global Exception Handling
@RestControllerAdvice, EK CENTRALIZED CLASS DEFINE karta hai, JO, SAARE @RestController classes ke, EXCEPTIONS ko, HANDLE karta hai — HAR CONTROLLER mein, DUPLICATE try-catch LIKHNE ke BAJAYE, EK JAGAH, @ExceptionHandler METHODS SE, DIFFERENT EXCEPTION TYPES ko, DIFFERENT RESPONSES mein, CONVERT kiya jaata hai.
EK TYPICAL, WELL-DESIGNED GLOBAL HANDLER, MULTIPLE, SPECIFIC EXCEPTIONS (jaise ResourceNotFoundException → 404, ValidationException → 400) ko, HANDLE karta hai, aur, AAKHIR mein, EK GENERIC Exception.class HANDLER, "SAFETY NET" ke ROOP mein, RAKHTA hai (500 Internal Server Error).
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
ErrorResponse error = new ErrorResponse("NOT_FOUND", ex.getMessage());
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidation(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(err ->
errors.put(err.getField(), err.getDefaultMessage()));
return ResponseEntity.badRequest().body(errors);
}
@ExceptionHandler(Exception.class) // catch-all, LAST resort
public ResponseEntity<ErrorResponse> handleGeneric(Exception ex) {
return ResponseEntity.internalServerError()
.body(new ErrorResponse("INTERNAL_ERROR", "Unexpected error occurred"));
}
}- @RestControllerAdvice = CENTRALIZED exception handling, saare controllers ke liye
- Specific exceptions PEHLE, generic Exception.class, LAST (catch-all)
- Field-level validation errors, CLIENT ko, DETAILED format mein DIYE ja sakte hain
AGAR, MULTIPLE, @ExceptionHandler METHODS, EK, HI, EXCEPTION HIERARCHY mein hain (jaise, EK, IllegalArgumentException ke liye, aur, EK, GENERIC Exception ke liye), Spring, "MOST SPECIFIC" MATCH, CHOOSE karta hai — SPECIFIC EXCEPTION, PEHLE, TRIGGER hoती hai.
GLOBAL, EXCEPTION HANDLER, EK, IDEAL, JAGAH hai, HAR, EXCEPTION ko, CENTRALLY, LOG karne ke liye — STACK TRACE, REQUEST DETAILS, aur, TIMESTAMP, LOG karके, DEBUGGING/MONITORING, EASY BANAYA ja sakta hai.
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleGeneric(Exception ex, HttpServletRequest req) {
log.error("Unhandled exception at {}: ", req.getRequestURI(), ex);
return ResponseEntity.internalServerError().body(new ErrorResponse("INTERNAL_ERROR", "..."));
}