SpringBoot全局异常处理

什么是全局异常处理

用于统一捕获代码运转过程中的各种异常

为什么使用全局异常处理 

  • 不用强制写try-catch,由全局异常处理器统一捕获处理。

  • 自定义异常,不能直接返回给客户端,客户端看不懂异常信息,只能全局异常捕获

  • Validator参数校验器,参数校验不通过会抛异常,但是无法通过try-catch语句捕获,只能使用全局异常处理器。

异常发生阶段分类图 


 如何使用

1.第一步自定义异常处理器类#

搭配使用即可捕获拦截器、参数绑定(参数解析、参数转换、参数校验)、Controller、返回值处理等抛出的异常

  • 组合注解@RestControllerAdvice

    • @ControllerAdvice

      • Controller增强器,给Controller层添加统一的操作或处理

    • @ResponseBody

      • 返回值自动为json格式

2.第二步定义方法指定要捕获的异常以及处理异常后的统一返回值与Http响应码 #

  • @ExceptionHandler

    • @ExceptionHandler,指定捕获Controller中抛出的指定类型的异常

  • @ResponseStatus

    • 用于指定捕获异常后响应的Http状态码

 

 3.具体使用流程#

定义exception包用于存储全局异常处理类

package com.lu.tlias84.exception;


import com.lu.tlias84.utils.ResultUtil;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Objects;

/**
 * 因为我们无法只用try-catch捕获进入controller之前的异常,
 * 但是可以使用aop对controller进行调用之前的增强
 * 因此@RestControllerAdvice相当于环绕统治controller
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ArithmeticException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResultUtil handleArithmeticException(){
        return ResultUtil.fail("发生1/0错误");
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResultUtil handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
        String defaultMessage = Objects.requireNonNull(e.getFieldError()).getDefaultMessage();
        Object rejectedValue = e.getFieldError().getRejectedValue();
        return ResultUtil.fail(defaultMessage,rejectedValue);
    }
}


配合约束注解实现异常捕获 

package com.lu.tlias84.entity;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.javassist.expr.Expr;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 员工类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Emp {
    /**
     * 插入用于主键回显
     */
    private int id;

    @NotNull(message = "用户名不能为空")
    @Length(min=2,max=20,message = "用户长度为[2,20]")
    private String username;

    private String password;

    @NotNull(message = "姓名不能为空")
    @Length(min=2,max=10,message = "姓名长度为[2,20]")
    private String name;

    private int gender;

    @Length(min=11,message = "手机号长度必须是11位")
    @Pattern(regexp = "^1[3-9]\\d{9}$",message = "手机号格式错误")
    private String phone;

    private Integer job;

    private Integer salary;

    private String image;

    private LocalDate entryDate;

    private Integer deptId;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    private List<Experience> exprList;
}

{

    "code": 0,

    "msg": "手机号格式错误",

    "data": "188364236aaaa87"

}

 

面试题 

1.如何使用全局异常处理?#

  • java 异常体系

  • Spring的全局异常处理

作者:freps

出处:https://www.cnblogs.com/freps/p/18468277

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   LL。。。  阅读(324)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示