SpringBoot实现全局异常处理总结

发布于 2024-07-19
1049

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

扫码阅读
手机扫码阅读
SpringBoot实现全局异常处理摘要

SpringBoot实现全局异常处理摘要

异常处理现状及问题

在项目开发中,异常处理非常常见,传统的try-catch方法会导致代码可读性差,逻辑混乱。为了集中精力于业务逻辑,推荐使用全局异常处理方法,主要包括两种方式:HandlerExceptionResolver以及@ControllerAdvice结合@ExceptionHandler

全局异常处理的基础知识

@ControllerAdvice是一个特殊的@Component,用于定义全局异常处理类,作用于所有@Controller类型的接口。@ExceptionHandler用于声明异常处理方法。

配置全局异常处理

通过@ControllerAdvice@ExceptionHandler,可以减少在Controller中使用try-catch的频率。示例代码如下:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception {
        String message = exception.getMessage() + request.getRequestURL().toString();
        return CommonResult.failed(message);
    }
}

此基础方法可实现简单的异常处理,但不足以满足复杂项目需求。

全局异常处理的优化

通过自定义异常类ServiceException,开发者可以明确异常来源模块,并根据业务模块定制不同的处理方式。示例代码如下:

public class ServiceException extends RuntimeException {
    private IErrorCode errorCode;
    public ServiceException(IErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }
    ...
}

处理数据绑定与校验异常

Controller层使用@Validated@RequestBody注解进行数据绑定和校验时,如果校验失败会抛出MethodArgumentNotValidException。通过在全局异常处理类中添加处理声明,可以集中管理这些异常。

@ResponseBody
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public CommonResult handleValidException(MethodArgumentNotValidException e) {
    BindingResult bindingResult = e.getBindingResult();
    String message = null;
    if (bindingResult.hasErrors()) {
        FieldError fieldError = bindingResult.getFieldError();
        if (fieldError != null) {
            message = fieldError.getField() + fieldError.getDefaultMessage();
        }
    }
    return CommonResult.validateFailed(message);
}

这种方式进一步简化了Controller层的异常处理逻辑。

完整代码及总结

通过集中管理Service异常、数据校验异常及未知异常,所有异常处理逻辑均在GlobalExceptionHandler类中实现,提升了代码的可维护性与可读性。

完整代码可参考GitHub仓库:https://github.com/bangbangzhou/greemes/tree/master

总结

本文主要介绍了如何使用@ControllerAdvice@ExceptionHandler实现Controller层的全局异常处理,并提供了一些优化和扩展的实践示例。

springboot葵花宝典

主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目

275 篇文章
浏览 273.8K

还在用多套工具管项目?

一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。

加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线