介绍
本篇介绍Springboot统一异常处理,自定义异常,前后端交互的时候我们可以进行全局异常catch。这样便于在系统出现错误的时候,我们方便排查错误。
统一结果与自定义错误枚举类
package com.elite.springboot.common;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 统一结果
*/
@Accessors(chain=true)
@Data
public class R {
//请求返回的代码
private Integer code;
//请求的信息
private String msg;
//数据
private Object data;
//成功
public static R ok(Object data){
return new R().setCode(200).setMsg("成功").setData(data);
}
//成功
public static R ok(Integer code,String msg,Object data){
return new R().setCode(code).setMsg(msg).setData(data);
}
//失败
public static R fail(){
return new R().setCode(400).setMsg("请求失败!");
}
//失败
public static R fail(Integer code,String msg){
return new R().setCode(code).setMsg(msg).setData(null);
}
}
错误枚举
package com.elite.springboot.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 统一错误枚举类
*/
@Getter
@AllArgsConstructor //全参数构造器
public enum ErrorEnum {
SUCCESS(200,"请求成功"),
FAIL(400,"请求错误"),
SERVERERROR(500,"服务器内部错误"),
PASSWORDERROR(10001,"密码错误"),
PARAMETERERROE(10002,"请求参数错误"),
NPERROR(10003,"空指针异常"),
DIVERROR(10004,"除数异常"),
MYEXCEPTION(10005,"自定义异常")
// ....等等
;
private Integer code;
private String message;
}
全局异常处理
全局异常我们需要使用注解@ControllerAdvice,@ExceptionHandler指定异常的类型。
package com.elite.springboot.exception;
import com.elite.springboot.common.ErrorEnum;
import com.elite.springboot.common.R;
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 R commonHandle(Exception e){
e.printStackTrace();
return R.fail(ErrorEnum.FAIL.getCode(),ErrorEnum.FAIL.getMessage());
}
//空指针异常
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public R commonHandle(NullPointerException e){
e.printStackTrace();
return R.fail(ErrorEnum.NPERROR.getCode(),ErrorEnum.NPERROR.getMessage());
}
//空指针异常
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public R commonHandle(ArithmeticException e){
e.printStackTrace();
return R.fail(ErrorEnum.DIVERROR.getCode(),ErrorEnum.DIVERROR.getMessage());
}
//自定义异常
//空指针异常
@ExceptionHandler(MyException.class)
@ResponseBody
public R commonHandle(MyException e){
e.printStackTrace();
return R.fail(ErrorEnum.MYEXCEPTION.getCode(),ErrorEnum.MYEXCEPTION.getMessage());
}
}
自定义异常可以继承Exception或者运行时异常RuntimeException,重写异常的方法。
package com.elite.springboot.exception;
public class MyException extends RuntimeException{
//可以在内部进行处理抛出自定义异常错误信息
}
测试
可以看到我们测试代码里边没有加try catch代码块,有异常自动会被全局异常拦截返回错误信息。
package com.elite.springboot.controller;
import com.elite.springboot.common.ErrorEnum;
import com.elite.springboot.common.R;
import com.elite.springboot.exception.MyException;
import org.springframework.web.bind.annotation.*;
/**
* 测试异常类controller
*/
@RequestMapping
@RestController
public class ExceptionController {
//空指针异常
@GetMapping("/exception1")
public R test1(){
String s = null;
boolean equals = s.equals("");
return R.ok(null);
}
//运算异常
@GetMapping("/exception2")
public R test2(){
int i = 5/0 ;
return R.ok(null);
}
}
测试结果
http://localhost:8811/exception1
{"code":10003,"msg":"空指针异常","data":null}
http://localhost:8811/exception2
{"code":10004,"msg":"除数异常","data":null}