全局异常处理器详解(源码级别)

一、全局异常处理器的基本使用使用

定义一个全局异常处理器,@RestControllerAdvice是@ControllerAdvice和@ResponseBody两个注解的功能总和,使异常以json格式数据返回。出现异常后无论是什么异常都会输出程序出现异常。

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

/**
 * 全局异常处理器,处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(Exception ex){
        log.error("异常信息:{}", ex.getMessage());
        return Result.error("程序出现异常");
    }

}

二、规范化使用全局异常处理器

可以从第一个基础使用发现,我们程序出现异常时候都是打印”程序出现异常这句话“,显然不是我们需要的,虽然可以输出ex.getMessage()来区分是什么异常,但是打印的异常信息是英文的,我们需要自定义异常信息。
1.Exception是所有异常类的父类,我们要自定义异常类就必须继承这个Exception

public class BaseException extends RuntimeException {

    public BaseException() {
    }

    public BaseException(String msg) {
        super(msg);
    }

}

2.BaseException是一个中转类,我们所有自定义异常类都继承这个类

登录常出现的账户不存在异常类:

public class AccountNotFoundException extends BaseException {
	public String ACCOUNT_NOT_FOUND="账号已存在"; 

    public AccountNotFoundException() {
    }

    public AccountNotFoundException(String msg) {
        super(ACCOUNT_NOT_FOUND);
    }

}

用户没有登录异常类

public class UserNotLoginException extends BaseException {
    public String ACCOUNT_NOT_LOGIN="账号已存在"; 


    public UserNotLoginException() {
    }

    public UserNotLoginException(String msg) {
        super(ACCOUNT_NOT_LOGIN);
    }

}

3.全局自定义异常类

import com.sky.exception.BaseException;
import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器,处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex){
        log.error("异常信息:{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }

}

这样我们就可以自定义我们需要的任何自定义异常类了
4.使用(登录为例子)

public Employee login(EmployeeLoginDTO employeeLoginDTO) {
        String username = employeeLoginDTO.getUsername();
        String password = employeeLoginDTO.getPassword();

        //1、根据用户名查询数据库中的数据
        Employee employee = employeeMapper.getByUsername(username);

        //2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
        if (employee == null) {
            //账号不存在
            throw new AccountNotFoundException();
        }
    }

三、源码讲解

用户没有登录异常为例子

public class UserNotLoginException extends BaseException {
    public String ACCOUNT_NOT_LOGIN="账号已存在"; 


    public UserNotLoginException() {
    }

    public UserNotLoginException(String msg) {
        super(ACCOUNT_NOT_LOGIN);
    }

}

1.点击super进入父类构造器BaseException

public class BaseException extends RuntimeException {

    public BaseException() {
    }

    public BaseException(String msg) {
        super(msg);
    }

}

2.点击super进入父类构造器RuntimeException

public RuntimeException(String message) {
        super(message);
    }

3.点击super进入父类构造器Exception

public Exception(String message) {
        super(message);
    }
4.点击super进入父类构造器Throwable
public Throwable(String message) {
        fillInStackTrace();
        detailMessage = message;
    }

5.任何看全局异常处理器获取这个detailMessage 值了,也就是自定义异常

import com.sky.exception.BaseException;
import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器,处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex){
        log.error("异常信息:{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }

}

进入getMessage方法

public String getMessage() {
        return detailMessage;
    }

三、总结

自定义异常处理能够显示自己想要展示的异常信息,方便前端显示,我们定义的异常信息最终在全局异常处理器哪里获取到l。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值