全局异常处理

我们现在已经完成了员工管理和部门管理两个功能接口,但是此时我们发现如果前端编辑员工或部门时发生了错误,比如用户名重复,手机号重复这些,那么前端是收不到提示的,此时我们要解决这个问题。

我们要新建一个异常包和一个处理异常的类,此时需要用到两个新的注解,分别为:

@RestControllerAdvice:
@ExceptionHandler:

package com.itheima.exception;

import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public Result ExceptionHandler1(Exception e){
        log.info("程序出错啦!", e);
        return Result.error("出错了,请联系管理员");
    }
}

这样的话前端的数据出现错误时,就会直接在前端页面上收到反馈

下一步我的目标是让这个出错信息更具体,比如我现在手机号重复了,那么就要直接提示是手机号重复的问题。

我们先在 idea 的控制台中找到这一句话

 Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '18809091212' for key 'emp.phone'

意思很简单啊,就是说这个号码重复了,那么我就专门新建一个方法用来处理这个异常

这里接收的异常参数和上面不一样就是专门处理 Duplicate 的参数,还有一些简单的算法步骤如下:
 

    @ExceptionHandler
    public Result EceptionHandler2(DuplicateKeyException e){
        log.info("“程序出错啦:", e);
        //1:首先把这个异常语句转化成 string 提取出来
        String s = e.getMessage();

        //2:找到我们需要的那句异常
        int idx = s.indexOf("Duplicate entry");

        //3:讲这句话提取出来
        String ss = s.substring(idx);

        //4:将这句话进行划分,找到我们需要的哪个号码
        String[] arr = ss.split(" "); // 很明显是按照空格进行划分

        //5:输出我们需要的信息
        return Result.error("号码重复了: " + arr[2]);
    }

那么这时候可能有人会问:如果出现了 Duplicate 型的异常,到底是匹配第一种方法,还是第二种方法呢?因为第一种方法显然也包含了第二种方法啊。

 

我们打开这个参数类的可视化图; 

我们可以看到,这种匹配就是从下往上匹配的,如果在下面匹配到了,就不用往上跑了。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值