Rethinking Global Exception Handling in SpringBoot Applications

This article examines the pitfalls of using SpringBoot's @ControllerAdvice and @ExceptionHandler for global exception handling, illustrates common issues across controller, service, and data layers, and proposes more precise logging and debugging strategies to improve error traceability and maintainability.

Rare Earth Juejin Tech Community
Rare Earth Juejin Tech Community
Rare Earth Juejin Tech Community
Rethinking Global Exception Handling in SpringBoot Applications

In SpringBoot development, using @ControllerAdvice together with @ExceptionHandler to implement a unified global exception management has become a common convention, but the author questions its suitability.

Global exception handling typically creates a global exception processor that intercepts exceptions from controller, service, and data layers, reducing repetitive try‑catch code. However, the author’s recent debugging experience shows that overly broad handling (e.g., catching Exception.class) obscures the origin of errors, making troubleshooting difficult.

The article outlines the three‑tier architecture (controller, service, data access) and the typical exceptions each layer may throw, illustrated with a diagram.

It then presents a basic global handler example:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGlobalException(Exception ex) {
        // implement exception handling logic
        log.error(ex.getMessage());
        return Result.error(ex.getMessage());
    }
}

While this catches many exceptions, the coarse‑grained approach prevents precise location of the fault, forcing developers to rely on manual log inspection.

To improve diagnostics, the author recommends logging detailed context such as the request URL, method, parameters, and full stack trace. An enhanced handler example is provided:

@Slf4j
@RestControllerAdvice
public class GlobExceptionHandler {
    @ExceptionHandler(ArithmeticException.class)
    public String exceptionHandler(HttpServletRequest request, ArithmeticException exception) {
        log(request, exception);
        return exception.getMessage();
    }

    public void log(HttpServletRequest request, Exception exception) {
        String lineSeparatorStr = System.getProperty("line.separator");
        StringBuilder exStr = new StringBuilder();
        for (StackTraceElement s : exception.getStackTrace()) {
            exStr.append("\tat " + s + "
");
        }
        log.error("访问地址:" + request.getRequestURL() + ",请求方法:" + request.getMethod()
                + ",远程地址:" + request.getRemoteAddr() + lineSeparatorStr
                + "错误堆栈信息如下:" + exception.toString() + lineSeparatorStr + exStr);
    }
}

The enriched logs display URL, method, remote address, and full stack trace, dramatically reducing the effort required to locate bugs in production.

In conclusion, global exception handling should serve as a fallback mechanism rather than a universal solution; developers should avoid merely printing e.getMessage() and instead record comprehensive diagnostic information to maintain system reliability.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

BackendDebuggingJavaloggingSpringBootexceptionhandling
Rare Earth Juejin Tech Community
Written by

Rare Earth Juejin Tech Community

Juejin, a tech community that helps developers grow.

0 followers
Reader feedback

How this landed with the community

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.