基于aop进行异常处理
统一异常处理
当controller上出现异常时候被捕捉
@RestController
@RequestMapping("/test")
public class TableTestController {
@GetMapping("/a")
public Result test(){
int i= 10/0;
return Result.ok().code(ResultCodeEnum.SUCCESS.getCode());
}
}
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GlobalExceptionHandle {
@ExceptionHandler(Exception.class)
@ResponseBody
public Result error(Exception e){
return Result.fail().code(404);
}
}
统一异常返回
@Data
public class Result<T> {
private Integer code;
private String message;
private T data;
public Result(){}
protected static <T> Result<T> build(T data) {
Result<T> result = new Result<T>();
if (data != null)
result.setData(data);
return result;
}
public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
Result<T> result = build(body);
result.setCode(resultCodeEnum.getCode());
result.setMessage(resultCodeEnum.getMessage());
return result;
}
public static <T> Result<T> build(Integer code, String message) {
Result<T> result = build(null);
result.setCode(code);
result.setMessage(message);
return result;
}
public static<T> Result<T> ok(){
return Result.ok(null);
}
/**
* 操作成功
* @param data
* @param <T>
* @return
*/
public static<T> Result<T> ok(T data){
Result<T> result = build(data);
return build(data, ResultCodeEnum.SUCCESS);
}
public static<T> Result<T> fail(){
return Result.fail(null);
}
/**
* 操作失败
* @param data
* @param <T>
* @return
*/
public static<T> Result<T> fail(T data){
Result<T> result = build(data);
return build(data, ResultCodeEnum.FAIL);
}
public Result<T> message(String msg){
this.setMessage(msg);
return this;
}
public Result<T> code(Integer code){
this.setCode(code);
return this;
}
public boolean isOk() {
if(this.getCode().intValue() == ResultCodeEnum.SUCCESS.getCode().intValue()) {
return true;
}
return false;
}
}
统一状态码
package com.lyf;
import lombok.Getter;
@Getter
public enum ResultCodeEnum {
SUCCESS(200,"成功"),
FAIL(201, "失败"),
PARAM_ERROR( 202, "参数不正确"),
SERVICE_ERROR(203, "服务异常"),
DATA_ERROR(204, "数据异常"),
DATA_UPDATE_ERROR(205, "数据版本异常"),
LOGIN_AUTH(208, "未登陆"),
PERMISSION(209, "没有权限"),
CODE_ERROR(210, "验证码错误"),
// LOGIN_MOBLE_ERROR(211, "账号不正确"),
LOGIN_DISABLED_ERROR(212, "改用户已被禁用"),
REGISTER_MOBLE_ERROR(213, "手机号已被使用"),
LOGIN_AURH(214, "需要登录"),
LOGIN_ACL(215, "没有权限"),
URL_ENCODE_ERROR( 216, "URL编码失败"),
ILLEGAL_CALLBACK_REQUEST_ERROR( 217, "非法回调请求"),
FETCH_ACCESSTOKEN_FAILD( 218, "获取accessToken失败"),
FETCH_USERINFO_ERROR( 219, "获取用户信息失败"),
//LOGIN_ERROR( 23005, "登录失败"),
PAY_RUN(220, "支付中"),
CANCEL_ORDER_FAIL(225, "取消订单失败"),
CANCEL_ORDER_NO(225, "不能取消预约"),
HOSCODE_EXIST(230, "医院编号已经存在"),
NUMBER_NO(240, "可预约号不足"),
TIME_NO(250, "当前时间不可以预约"),
SIGN_ERROR(300, "签名错误"),
HOSPITAL_OPEN(310, "医院未开通,暂时不能访问"),
HOSPITAL_LOCK(320, "医院被锁定,暂时不能访问"),
;
private Integer code;
private String message;
private ResultCodeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}
自定义异常处理
1 自定义异常
@NoArgsConstructor
@AllArgsConstructor
@Data
public class MyException extends RuntimeException{
private Integer code;
private String msg;
public MyException(Integer code,String msg,Exception e){
// throw的时候 把异常放到自定义异常内
super(e);
this.code =code;
this.msg=msg;
}
}
2 tryCatch 捕获异常 把捕获到的 异常throw出自定义的异常
@GetMapping("/b")
public Result test1(){
try{
int i= 10/0;
return Result.ok().code(ResultCodeEnum.SUCCESS.getCode());
}catch (Exception e){
// 捕获到的异常转换成自定义异常
throw new MyException(ResultCodeEnum.CODE_ERROR.getCode(),"出现错误",e);
}
}
3 切面上对异常转换,既能规范返回前端也可以打出栈
@ExceptionHandler(MyException.class)
@ResponseBody
public Result error(MyException e){
// 栈结构
e.printStackTrace();
// 规范化
return Result.fail().code(ResultCodeEnum.SIGN_ERROR.getCode()).message(e.getMsg());
}