统一异常处理

统一异常处理


在代码中,如果有异常抛出,或者程序正常结束返回执行结果,最终返回的结果格式都不统一,为了对返回结果进行统一,就有了统一异常处理。

1.返回结果的规范化,定义Result类

public class Result {
	// 返回结果的code
	private Integer Code;
	// 返回的信息
	private String message;
	// 返回的结果
	private Object data;
	
	//get,set方法,不做赘述

2.避免代码的冗余,创建工具类统一返回Result

Result result = new Result();
result.setCode(0);
result.setMessage("成功");
result.setData(object);

但上面的写法,无论是成功还是失败都需要重新创建一个Result对象,然后进行setxxx操作,会造成代码的重复和冗余,此时,可以写一个共通类


public class ResultUtil {
	// 返回成功
	public static Result success(Object object){
		Result result = new Result();
		result.setCode(0);
		result.setMessage("成功");
		result.setData(object);
		return result;
	}
	
	public static Result success(){
		return success(null);
	}
	// 返回失败
	public static Result error(Integer code ,String message){
		Result result = new Result();
		result.setCode(code);
		result.setMessage(message);
		return result;
	}
}

这样在需要返回Result的地方直接调用工具类,传入相应参数即可。

3.自定义异常处理,拦截异常统一处理 ExceptionHandle

//异常处理
@ControllerAdvice  // 作用:拦截异常并统一处理
public class ExceptionHandle {
	
	private final static Logger logger = LoggerFactory.getLogger(ExceptionHandler.class);

	@ExceptionHandler(value=Exception.class) // 指定捕获的是哪个异常
	@ResponseBody
	public Result Handle(Exception e){
		if(e  instanceof PrivateException){
			PrivateException exception = (PrivateException) e;
			return ResultUtil.error(exception.getCode(), exception.getMessage());
		}else{
			logger.error("系统异常,{}",e);
			return ResultUtil.error(-1, "未知错误");			
		}
	}
}

4.自定义异常

//自己定义一个Exception,必须继承自RuntimeException
public class PrivateException extends RuntimeException{
	//错误码
	private Integer code;
	
	public PrivateException(ResultEnums resultEnums){
		super(resultEnums.getMessage());
		this.code = resultEnums.getCode();
	}

	public Integer getCode() {
		return code;
	}

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

5.为了错误码code和错误信息message的统一,创建枚举统一管理


public enum ResultEnums {
	UNKNOW_ERROR(-1,"未知错误"),
	SUCCESS(0,"成功"),
	PRIMARY_SCHOOL(100,"上小学"),
	MIDDLE_SCHOOL(101,"上初中")
;
	private Integer code;
	private String message;
	
	ResultEnums(Integer code, String message) {
		this.code = code;
		this.message = message;
	}

	public Integer getCode() {
		return code;
	}

	public String getMessage() {
		return message;
	}
}

总结流程:
场景:如果需要判断一个年纪,<10返回message是“上小学”,>10并且<16返回message是“上初中”,其他情况就做额外处理
这时候可以使用自定义异常,避免繁琐的if else

public void getAge(Integer age) throws Exception {
		if(age<10){
			// 上小学  抛出一个自定义异常
			throw new PrivateException(ResultEnums.PRIMARY_SCHOOL);
		}else if(age>10 && age<16){
			// 上初中
			throw new PrivateException(ResultEnums.MIDDLE_SCHOOL);
		}
		
		//其他额外操作
	}

抛出异常之后,上面的异常拦截器ExceptionHandle 就会拦截异常进行处理,返回错误信息。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值