更新时间:2020-06-19 12:55:57 来源:极悦 浏览1835次
自定义枚举类
自定义异常信息
统一返回信息
全局异常处理
01自定义枚举类
对于一些我们经常返回的错误信息,我们可以将其抽取出来封装成公共部分,然后将变化的作为参数传入。例如我们在业务中经常要校验某个字段是否为空,如果为空的话就要返回错误信息xxx字段不能为空,那么我们为什么不将xxx作为一个变量参数传递过来呢。于是就想到了用枚举类定义异常信息,然后用String.format()方法进行转义
public enum ResponseInfoEnum {
SUCCESS(ResponseResult.OK,"处理成功"),
PARAM_LENGTH_ERROR(ResponseResult.ERROR, "参数:%s,长度错误,max length: %s"),
REQ_PARAM_ERROR(ResponseResult.ERROR, "请求报文必填参数%s缺失"),;
private Integer code;
private String message;
ResponseInfoEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
使用方法如下
String.format(ResponseInfoEnum.REQ_PARAM_ERROR.getMessage(),"testValue")
可以看到生成的错误信息是请求报文必填参数testValue缺失
02自定义异常信息
首先我们需要知道我们为什么要用自定义异常信息呢?使用它有什么好处呢?
首先我们开发中肯定是分模块进行开发的,所以首先我们统一了自定义异常类就统一了对外异常的展示方式。
使用自定义异常继承相关的异常来抛出处理后的异常信息可以隐藏底层的异常,这样更安全,异常信息也更加的直观。自定义异常可以抛出我们自己想要抛出的信息,可以通过抛出的信息区分异常发生的位置,根据异常名我们就可以知道哪里有异常,根据异常提示信息进行程序修改。
有时候我们遇到某些校验或者问题时,需要直接结束掉当前的请求,这时便可以通过抛出自定义异常来结束,如果你项目中使用了SpringMVC比较新的版本的话有控制器增强,可以通过 ControllerAdvice注解写一个控制器增强类来拦截自定义的异常并响应给前端相应的信息。
自定义异常我们需要继承RuntimeException
public class CheckException extends RuntimeException{
public CheckException() {
}
public CheckException(String message) {
super(message);
}
public CheckException(ResponseInfoEnum responseInfoEnum,String ...strings) {
super(String.format(responseInfoEnum.getMessage(),strings));
}
}
03统一返回信息
在我刚开始工作的一年中,所接触的最多的项目就是前后端交互的项目了。所以有一个统一的返回信息不仅对前端来说更加便利,对于我们后面的AOP代理也有很大的好处。
@Data
@NoArgsConstructor
public class ResponseResult<T> {
public static final Integer OK = 0;
public static final Integer ERROR = 100;
private Integer code;
private String message;
private T data;
}
这样前后端进行交互时就会更加便利了,如果要取业务数据那么就从data中取,去过要取是否成功的标志,那么就从code码中取,如果要取后端返回的信息,那么就从message中取。
04全局异常处理
在我之前的项目中每个Controller方法中都充斥着try....catch...的代码,而catch后的代码都是大同小异,都是封装了一下返回的错误信息之类的。那么我们为什么不将这些代码抽取出来,利用Spring的全局异常处理简化我们的代码呢?
@Slf4j
@ControllerAdvice
public class ControllerExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseResult<String> defaultErrorHandler(HttpServletRequest request, Exception exception){
log.error(ControllerLog.getLogPrefix()+"Exception: {}"+exception);
return handleErrorInfo(exception.getMessage());
}
@ExceptionHandler(CheckException.class)
@ResponseBody
public ResponseResult<String> checkExceptionHandler(HttpServletRequest request, CheckException exception){
return handleErrorInfo(exception.getMessage());
}
private ResponseResult<String> handleErrorInfo(String message) {
ResponseResult<String> responseEntity = new ResponseResult<>();
responseEntity.setMessage(message);
responseEntity.setCode(ResponseResult.ERROR);
responseEntity.setData(message);
ControllerLog.destoryThreadLocal();
return responseEntity;
}
}
其中全局异常处理中,我们自定义的异常就没有打印日志,因为对于自定义的异常我们是已知的异常,并且错误信息也已经很明确的返回了。而对于未知异常例如Exception就属于未知的异常,我们就需要打印日志,如果这里有特殊需求,例如发短信、发邮件通知相关人员的话,这里也能够进行全局的配置。
以上就是极悦java培训机构的小编针对“Java后端开发视频只学习需要注意哪几点”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习