返回目录
1.异常情况定义
定义统一异常码
public interface RetCode {
/**
* 返回的错误码
* @return
*/
int getCode();
/**
* 返回的错误信息
* @return
*/
String getMessage();
}
public enum ErrorCode implements RetCode {
SUCCESS(0, "操作成功"),
SYSTEM_ERR(1, "系统错误,请联系管理员"),
;
private int code;
private String message;
ErrorCode(int code, String message) {
this.code = code;
this.message = message;
}
@Override
public int getCode() {
return this.code;
}
@Override
public String getMessage() {
return this.message;
}
}
public enum ErrorCodeBiz implements RetCode {
SYS_LOGIN_ACCOUNT_PASSWORD_ERROR(101001,"用户名或密码错误"),
;
private int code;
private String message;
ErrorCodeBiz(int code,String message){
this.code = code;
this.message = message;
}
@Override
public int getCode() {
return this.code;
}
@Override
public String getMessage() {
return this.message;
}
}
定义统一异常
public class BusinessException extends RuntimeException implements RetCode {
private int code;
private String message;
public BusinessException(int code,String message){
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
通过ExceptionHandler定义异常统一处理方法
@RestControllerAdvice(basePackages = {"com.github.zq84.demo.web"}) // 注意,这里需要添加扫描的包
public class WebResponseHandle {
private static final Logger log = LoggerFactory.getLogger(WebResponseHandle.class);
/**
* 统一异常处理
*
* @param e
* @return
*/
@ExceptionHandler({BusinessException.class, Exception.class})
public R exceptionHandler(Exception e) {
if (e instanceof BusinessException) {
return R.error((BusinessException) e);
}else {
e.printStackTrace();
log.error(e.getMessage());
return R.error();
}
}
}
2. 优化(统一异常封装,减少if/异常判断)
public class Assert {
/**
* expression如果为true,表示预期错误信息没有发生,直接继续执行
*
* @param expression 布尔表达式
* @param rc
*/
public static void check(boolean expression, RetCode rc) {
if (!expression) {
throw new BusinessException(rc.getCode(), rc.getMessage());
}
}
}
使用范例
/**
* 当username或password为空时返回错误信息
* @param params
* @return
*/
@PostMapping("/t2")
public Map<String,Object> hello2(@RequestBody Map<String,String> params) {
String username = params.get("username");
String password = params.get("password");
Assert.check(!StringUtils.isEmpty(username), ErrorCodeBiz.SYS_LOGIN_ACCOUNT_PASSWORD_ERROR);
Assert.check(!StringUtils.isEmpty(password), ErrorCodeBiz.SYS_LOGIN_ACCOUNT_PASSWORD_ERROR);
Map<String,Object> map = new HashMap<>();
map.put("username",username);
map.put("password", password);
map.put("data","数据正确");
return map;
}
代码链接:https://gitee.com/johnny/learn-demo/tree/master/springboot-demo/boot01-05-common-ex