Maison > Java > javaDidacticiel > Comment implémenter la gestion unifiée des exceptions dans SpringBoot

Comment implémenter la gestion unifiée des exceptions dans SpringBoot

WBOY
Libérer: 2023-05-10 22:01:04
avant
1194 Les gens l'ont consulté

Scénario : Pour la gestion des exceptions, notre approche originale consiste généralement à capturer les exceptions au niveau de la couche la plus externe, comme dans Controller

@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);
  }
}
Copier après la connexion

Cela peut également résoudre certains problèmes, mais il ne peut pas obtenir les exceptions spécifiées par lui-même, introduisant une unification globale. Gestion des exceptions améliorera considérablement le code et réduira la génération de code redondant.

Classe d'exception personnalisée : veillez à hériter de RuntimeException au lieu d'Exception. Si vous héritez d'Exception, la transaction Spring ne sera pas annulée lorsqu'une exception personnalisée est levée

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;
  }
}
Copier après la connexion

Gestionnaire d'exceptions unifié personnalisé : les deux clés Annoter. @ControllerAdvice, @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!");
  }
 
}
Copier après la connexion

Écrivez une classe de test pour tester

@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");
  }
}
Copier après la connexion

Encapsulez le code et le message dans l'énumération ConstantEnum pour faciliter la maintenance unifiée

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;
  }
}
Copier après la connexion

Comment implémenter la gestion unifiée des exceptions dans SpringBoot

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal