Backend Development 20 min read

Unified Exception Handling in Spring Boot Using @ControllerAdvice, Assert, and Enum-based Error Codes

This article explains how to replace repetitive try‑catch blocks in Java backend development with a unified exception handling approach using Spring's @ControllerAdvice, custom Assert utilities, and enum‑based error codes, providing cleaner code, consistent error responses, and easy internationalization.

Architecture Digest
Architecture Digest
Architecture Digest
Unified Exception Handling in Spring Boot Using @ControllerAdvice, Assert, and Enum-based Error Codes

In many Java backend projects a large amount of code is filled with try { ... } catch { ... } finally { ... } blocks, which makes the source hard to read and maintain. The article first compares an ugly try‑catch style with a more elegant controller implementation.

Spring 3.2 introduced @ControllerAdvice and @ExceptionHandler , which allow developers to define global exception handling logic that applies to all controllers without duplicating code in each class.

The article presents a custom Assert utility that wraps null‑checks and throws a specific exception when a condition fails. Example implementation: public abstract class Assert { public static void notNull(@Nullable Object object, String message) { if (object == null) { throw new IllegalArgumentException(message); } } }

To avoid creating many exception classes, an enum is used to hold error codes and messages. The enum implements a BusinessExceptionAssert interface that creates a BusinessException with the appropriate code and formatted message. Example enum snippet: public enum ResponseEnum implements BusinessExceptionAssert { BAD_LICENCE_TYPE(7001, "Bad licence type."), LICENCE_NOT_FOUND(7002, "Licence not found."); private int code; private String message; }

The unified exception handler class annotated with @ControllerAdvice defines several @ExceptionHandler methods: handling BusinessException , generic BaseException , servlet‑related exceptions, binding and validation errors, and a catch‑all Exception . Each method logs the error and returns a consistent ErrorResponse containing code and message . Example handler method: @ExceptionHandler(value = BusinessException.class) @ResponseBody public ErrorResponse handleBusinessException(BaseException e) { log.error(e.getMessage(), e); return new ErrorResponse(e.getResponseEnum().getCode(), getMessage(e)); }

For 404 handling, the default behavior is changed by setting spring.mvc.throw-exception-if-no-handler-found=true and disabling static resource mappings, so that a NoHandlerFoundException is thrown and can be processed by the unified handler.

In service code the enum‑based assert is used to validate inputs, e.g. ResponseEnum.LICENCE_NOT_FOUND.assertNotNull(licence); , which throws the corresponding exception without manual if checks.

Overall, the approach eliminates most repetitive try‑catch code, provides a single place for error response formatting, supports internationalized messages, and makes the backend codebase cleaner and more maintainable.

BackendJavaException HandlingSpringenumRESTAssert
Architecture Digest
Written by

Architecture Digest

Focusing on Java backend development, covering application architecture from top-tier internet companies (high availability, high performance, high stability), big data, machine learning, Java architecture, and other popular fields.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.