学习springBoot 进阶统一异常处理(六)

在实际开发当中我们经常会遇到BUG,所以都会封装一个异常返回类来使用,提示我们到底是那一步出了问题,方便于我们追踪问题并且解决问题,

以下举个添加女孩对象为例子,当添加的女孩对象年龄小于10岁时我们提示该女孩在上小学,大于10岁且小于16岁提示可能在上初中,通过例子说明我们如何对异常统一处理并返回提示结果的

 在domain包下添加一个Result类

 

Result类 

package com.zhang.domain;

/**
 * http请求返回的最外层对象
 * @author Administrator
 *
 */
public class Result<T> {
	
	/**
	 * 错误码
	 */
	private Integer code;
	
	/**
	 * 提示信息
	 */
	private String msg;
	
	/**
	 * 具体的内容
	 */
	private T data;

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}
	
	
	
	
	
}

 修改GirlController类中的tian添加女孩对象方法

	/**
	 * 新增一个女孩
	 */
	@PostMapping(value="/girlsAdd")
	public Result<Girl> girlAdd(@Valid  Girl girl , BindingResult bindingResult){
		if(bindingResult.hasErrors()){
			Result result = new Result();
			result.setCode(1);
			result.setMsg(bindingResult.getFieldError().getDefaultMessage());
			return result;
		}
		girl.setCupSize(girl.getCupSize());
		girl.setAge(girl.getAge());
		Result result = new Result();
		result.setCode(0);
		result.setMsg("成功!");
		result.setData(girlRepository.save(girl));
		return result;
	}

修改完成启动项目看看之前整合的Result类有没有成功

Postman 调用添加女孩对象的方法 成功返回外层结果对象整合Result类

对于返回结果我们会频繁使用,所以我们对于返回结果在封装成一个公共类方便以后调用

创建utils包,ResultUtil类

ResultUtil 类

package com.zhang.utils;

import com.zhang.domain.Result;

/**
 * 返回结果工具类
 * @author Administrator
 *
 */
public class ResultUtil {

	public static Result success(Object object){
		
		Result result =  new Result();
		result.setCode(0);
		result.setMsg("成功");
		result.setData(object);
		return result;
	}

	public static Result success(){
		return success(null);
	}
	
	public static Result error(Integer code,String msg){
		Result result =  new Result();
		result.setCode(code);
		result.setMsg(msg);
		return result;
	}
	
	
}

 GirlController 类中的新增女生对象方法也修改一下

	/**
	 * 新增一个女孩
	 */
	@PostMapping(value="/girlsAdd")
	public Result<Girl> girlAdd(@Valid  Girl girl , BindingResult bindingResult){
		if(bindingResult.hasErrors()){
			return ResultUtil.error(1, bindingResult.getFieldError().getDefaultMessage());
		}
		girl.setCupSize(girl.getCupSize());
		girl.setAge(girl.getAge());
		return ResultUtil.success(girl);
	}

 Postman 调用添加女孩对象的方法 整合ResultUtil类

下面继续接着完善开题我们说的按照年龄来判断要返回的结果

当添加的女孩对象年龄小于10岁时我们提示该女孩在上小学,大于10岁且小于16岁提示可能在上初中

GirlService 类 新增处理逻辑的方法

	/**
	 * 统一抛出异常让封装好的异常类返回封装好的值到也页面中
	 * @param id
	 * @throws Exception
	 */
	public void getAge(Integer id ) throws Exception{
		Girl girl = girlRepository.findOne(id);
		Integer age = girl.getAge();
		if(age<10){
			throw new Exception("你还在上小学");
		}else if(age>10 && age<16){
			throw new Exception("你还在上初中");
		}
	}

GirlController 类新增一个查询的方法 调用GirlService 类中处理逻辑的方法

	@GetMapping(value="grils/getAge/{id}")
	public void getAge(@PathVariable("id") Integer id) throws Exception {
		girlService.getAge(id);
	}

创建Handle包 和 ExceptionHandle类

ExceptionHandle类

package com.zhang.Handle;

import javax.xml.ws.RespectBinding;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.zhang.domain.Result;
import com.zhang.utils.ResultUtil;

/**
 * 捕捉异常类
 * @author Administrator
 *
 */

@ControllerAdvice
public class ExceptionHandle {

	@ExceptionHandler(value=Exception.class)
	@ResponseBody
	public Result handle(Exception e){
		return ResultUtil.error(100, e.getMessage());
		
	}
	
	
	
	
}

  Postman 调用添加女孩对象的方法 整合ExceptionHandle类 统一异常处理整合成功,但是现实开发中我们还想要具体知道是在那一个环节报错的,那就继续在封装一下

 具体知道是在那一个环节报错的,那就继续在封装一下 让我们报错带上指定编号,这样我们就很快可以判断是哪里环节出了问题

创建 exception包  GrilException类

 GrilException类

package com.zhang.exception;

public class GrilException extends RuntimeException {
 
	
	private Integer code;
	
	
	

	public GrilException(Integer code , String message) {
		super(message);
		this.code = code;
	}

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}
	
	
	
	
	
	
}

 GirlService 类中 getAge方法修改一下

	/**
	 * 统一抛出异常让封装好的异常类返回封装好的值到也页面中
	 * @param id
	 * @throws Exception
	 */
	public void getAge(Integer id ) throws Exception{
		Girl girl = girlRepository.findOne(id);
		Integer age = girl.getAge();
		if(age<10){
			throw new  GrilException(100,"你还在上小学");
		}else if(age>10 && age<16){
			throw new GrilException(101,"你还在上初中");
		}
	}

ExceptionHandle 类 修改一下

	private final static Logger  logger= org.slf4j.LoggerFactory.getLogger(HttpAspect.class);
	
	@ExceptionHandler(value=Exception.class)
	@ResponseBody
	public Result handle(Exception e){
		
		//判断一下异常是不是返回的我们定义的
		if(e instanceof GrilException){
			GrilException grilException = (GrilException) e;
		  return  ResultUtil.error(grilException.getCode(), grilException.getMessage());
		}else{
			logger.info("【系统异常】{}",e);
			return ResultUtil.error(-1, "未知错误!!!");
		}
	}

Postman 调用添加女孩对象的方法 整合GrilException类成功    返回code是我们指定的101 这样就有助于我们对异常的指定位置

如果是系统异常报错误,我们可以用日志记录起来方便我们判断

 

 针对于实际开发当中是多人开发,编号会写重复,所以我们就在创建一个枚举类来统一管理我们 的编号避免重复

创建enums 包   ResultEnum类

ResultEnum 类

package com.zhang.enums;

/**
 * 管理编号的枚举类
 * @author Administrator
 *
 */

public enum ResultEnum {
	UNKONW_ERROR(-1,"未知错误"),
	SUCCCESS(0,"成功"),
	PRIMARY_SCHOOL(100,"你可能上小学"),
	MIODLE_SCHOOL(101,"你可能上初中"),
	
	;
	private Integer  code;
	
	private String  msg;

	private ResultEnum(Integer code, String msg) {
		this.code = code;
		this.msg = msg;
	}

	public Integer getCode() {
		return code;
	}

	public String getMsg() {
		return msg;
	}

	
	
	
	
}

 GirlService 类调用枚举类的方法 

	/**
	 * 统一抛出异常让封装好的异常类返回封装好的值到也页面中
	 * @param id
	 * @throws Exception
	 */
	public void getAge(Integer id ) throws Exception{
		Girl girl = girlRepository.findOne(id);
		Integer age = girl.getAge();
		if(age<10){
			throw new  GrilException(ResultEnum.PRIMARY_SCHOOL);
		}else if(age>10 && age<16){
			throw new GrilException(ResultEnum.MIODLE_SCHOOL);
		}
	}

GrilException 类中构造器方法修改

package com.zhang.exception;

import com.zhang.enums.ResultEnum;

/**
 * 异常类
 * @author Administrator
 *
 */
public class GrilException extends RuntimeException {
 
	
	private Integer code;
	
	
	

	public GrilException(ResultEnum resultEnum) {
		super(resultEnum.getMsg());
		this.code = resultEnum.getCode();
	}

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}
	
	
	
	
	
	
}

Postman 调用添加女孩对象的方法 整合ResultEnum类成功

猜你喜欢

转载自blog.csdn.net/qq_36908872/article/details/83515324
今日推荐