SpringBoot实现全局异常处理总结
1049
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
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葵花宝典
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
白皮书上线