一、全局异常处理器的基本使用使用
定义一个全局异常处理器,@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。