Spring Boot 统一异常处理
admin 发布于:2022-05-09 10:12:32
阅读:loading
正如Spring Boot 统一接口输出格式一样,对于系统的异常处理也需要站在全局的层面来封装异常的逻辑处理,本站的全局异常处理逻辑主要考虑以下几个层面:
(1)是否是用于提示或参数校验类型的异常逻辑,若是则不记录日志堆栈,将异常的描述信息返回至接口输出的结果中;
(2)是否是Ajax类型的请求类型,若是则响应结果为ErrorResult结构的JSON类型,供Ajax请求接收,否则若不为Ajax类型的请求则直接抛出异常,由底层系统的实现处理;
(3)是否为特殊类型的异常,即系统内置了一些类型的异常提示,若符合对应的异常类型则直接提示出对应的响应结果;
(4)若以上全不满足时,返回默认的异常提示处理,即获取当前异常堆栈的最里层错误信息直接响应给用户;
/**
* 全局异常处理
* @param ex 异常对象
* @param request request
* @return 操作结果
* @throws Exception 抛出异常
*/
@ExceptionHandler(Exception.class)
public BaseResult handerRestApiException(Exception ex , HttpServletRequest request) throws Exception {
//提示类的异常不需要输出错误堆栈
if(!(ex instanceof ValidateDataException)){
log.error("操作发生了错误:" , ex);
}
//非ajax请求直接使用系统默认的异常出来,判断是否为ajax请求
if(! Ajax.isAJAXRequest(request)) {
throw ex;
}
ExceptionTypeEnum exceptionType = ExceptionTypeEnum.getExceptionType(ex.getClass().getSimpleName());
if(exceptionType != null){
return ErrorResult.build().message(exceptionType.getMessage());
}
String message = ExceptionUtils.getRootCauseMessage(ex);
return ErrorResult.build().message(StringUtils.substring(message , message.indexOf(": ") + 1));
}
代码说明:以上的@ExceptionHandler修饰的方法声明位于ResponseBodyAdviceHandler中,不能单独存在于某个普通的@Component修饰的bean中;
/**
* 全局异常验证管理
* @author chendd
* @date 2022/5/24 20:35
*/
@Controller
@RequestMapping("/exception")
@Api(value = "测试全局异常响应验证接口" , tags = {"全局异常响应验证"})
public class ExceptionController {
@GetMapping("/ajax")
@ApiOperation(value = "测试Ajax请求响应",notes = "测试响应结果集(<b>Swagger页面Ajax访问</b>)",
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@ResponseBody
public String intValue(){
int result = 1/0;
return null;
}
@GetMapping("/page")
@ApiOperation(value = "测试http请求响应",notes = "测试响应结果集(<b>浏览器页面访问</b>)",
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String stringValue(){
throw new NullPointerException("自定义的异常输出");
}
}
代码说明:上述类为测试抛出异常的验证类,提供了两个简单的测试方法,分别是Ajax请求(使用swagger请求)的错误输出和基于浏览器http访问的异常响应。
(Ajax请求)
(http请求)
源码工程下载:源码下载.zip;
点赞
发表评论
当前回复:作者