创建全局异常处理器是一种常见的做法,用于集中处理所有控制器中的异常,并返回统一的错误响应。
1. 定义异常响应对象
package com.itheima.common;
//通用的响应结果
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class R {
private Integer code; //1成功 0失败
private String msg; //错误消息
private Object data; //数据
public static R ok(){
R r = new R();
r.setCode(1);
return r;
}
public static R ok(Object data){
R r = new R();
r.setCode(1);
r.setData(data);
return r;
}
public static R error(String msg){
R r = new R();
r.setCode(0);
r.setMsg(msg);
return r;
}
}
2. 创建全局异常处理器类
-
@RestControllerAdvice (@ControllerAdvice)
:- 用于标记类为全局异常处理类,它可以捕获所有控制器中的异常。
-
@ExceptionHandler
:- 用于指定处理特定类型的异常。
- 可以指定多个
@ExceptionHandler
方法来处理不同类型的异常。
package com.itheima.global;
import com.itheima.common.R;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 捕获并处理所有异常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public R exception(Exception e){
// 返回错误信息
return R.error(e.getCause().getMessage());
}
}
3.自定义异常
自定义异常类内容
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 基础枚举
*/
@Getter
@AllArgsConstructor
public enum BasicEnum implements IBasicEnum {
SUCCEED(200, "操作成功"),
LOGIN_FAIL(401, "用户登录失败"),
LOGIN_LOSE_EFFICACY(401, "登录状态失效,请重新登录"),
public final int code;
public final String msg;
}
自定义异常类
import com.zzyl.enums.BasicEnum;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class BaseException extends RuntimeException {
private BasicEnum basicEnum;
public BaseException(BasicEnum basicEnum) {
this.basicEnum = basicEnum;
}
}
在全局异常处理器里添加需要处理的处理类型即可(这里使用zzyl的示例)
@ExceptionHandler(BaseException.class)
public ResponseResult<String> handlerRuntimeException(BaseException e){
e.printStackTrace();
return ResponseResult.error(e.getBasicEnum());
}
@ExceptionHandler(Exception.class)
public ResponseResult<String> handlerUnknownException(Exception e){
e.printStackTrace();
return ResponseResult.error(e.getMessage());
}