Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan pengendalian pengecualian bersatu dalam SpringBoot

Bagaimana untuk melaksanakan pengendalian pengecualian bersatu dalam SpringBoot

WBOY
WBOYke hadapan
2023-05-10 22:01:041156semak imbas

Senario: Untuk pengendalian pengecualian, pendekatan asal kami adalah untuk menangkap pengecualian pada lapisan paling luar, seperti

@Controller
public class HelloController {
 
  private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
 
  @GetMapping(value = "/hello")
  @ResponseBody
  public Result hello() {
    try {
      //TODO 具体的逻辑省略……
    } catch (Exception e) {
      logger.error("hello接口异常={}", e);
      return ResultUtil.success(-1, "system error", null);
    }
    return ResultUtil.success(0, "success", null);
  }
}

dalam Pengawal Ini juga boleh menyelesaikan beberapa masalah, tetapi ia tidak boleh diperolehi. Memperkenalkan pengendalian pengecualian bersatu global untuk pengecualian yang ditentukan sendiri akan meningkatkan kod dan mengurangkan penjanaan kod berlebihan.

Kelas pengecualian tersuai: Ambil perhatian bahawa ia mesti mewarisi daripada RuntimeException dan bukannya Exception Jika ia mewarisi daripada Exception, transaksi musim bunga tidak akan berbalik apabila pengecualian tersuai dilemparkan

public class GlobalException extends RuntimeException {
 
  private Integer code; //因为我需要将异常信息也返回给接口中,所以添加code区分
 
  public GlobalException(Integer code,String message) {
    super(message);  //把自定义的message传递个异常父类
    this.code = code;
  }
 
  public Integer getCode() {
    return code;
  }
 
  public void setCode(Integer code) {
    this.code = code;
  }
}

Pengendali pengecualian Disatukan Tersuai: dua anotasi utama @ControllerAdvice dan @ExceptionHandler

@ControllerAdvice
public class ExceptionHandle {
 
  @ResponseBody  //因为我需要将抛出的异常返回给接口,所以加上此注解
  @ExceptionHandler
  public Result handle(Exception e) {
    if (e instanceof GlobalException) {
      GlobalException ge = (GlobalException) e;
      return ResultUtil.success1(ge.getCode(), ge.getMessage());
    }
    return ResultUtil.success1(-1, "system error!");
  }
 
}

Tulis kelas ujian untuk menguji

@GetMapping(value = "/hello1")
@ResponseBody
public Result hello(@RequestParam(value = "age", defaultValue = "50", required = false) Integer age) throws GlobalException {
  if (age  50) {
    throw new GlobalException(ConstantEnum.MORE50.getCode(), ConstantEnum.MORE50.getMsg());
  } else {
    return ResultUtil.success1(0, "success");
  }
}

merangkumkan kod dan mesej dalam ConstantEnum Dalam penghitungan , ia adalah mudah untuk penyelenggaraan bersepadu

public enum ConstantEnum {
 
  ERROR(-1, "system error!"),
  SUCCESS(100, "success"),
  LESS10(101, "自定义异常信息-我小于10岁"),
  MORE50(5001, "自定义异常信息-我大于50岁");
 
  private Integer code;
  private String msg;
 
  public Integer getCode() {
    return code;
  }
 
  public String getMsg() {
    return msg;
  }
 
  ConstantEnum(Integer code, String msg) {
    this.code = code;
    this.msg = msg;
  }
}

Bagaimana untuk melaksanakan pengendalian pengecualian bersatu dalam SpringBoot

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pengendalian pengecualian bersatu dalam SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam