一.目前的异常处理现状
当前我们的项目中如果出现了异常情况,是直接由idea控制台将异常输出出来。
当我们新增一个部门,也叫就业部时,会出现状态码为500的服务器端错误

我们可以看到服务器段出现了异常,原因是就业部重复了。因为我们在构建数据时限制了唯一约束。
现在可以看到服务器给前端响应过来的异常数据格式

可以发现当前格式并不满足统一响应结果Result,因此要将其改造成前端可以解析的统一响应结果Result。
但是当前我们并没有对异常进行任何处理。
二.异常处理

如果Mapper层出现了异常,会将异常向上抛给Service层,Service层继续向上抛给Controller层,Controller层在往上抛给框架,框架会给我们返回这个JSON格式的数据,里面返回的是错误的信息。

那么我们如何将错误信息改为Result格式的数据进行处理呢?
有两个方案,方案一即是在Controller的每个方法中进行try...catch处理,对异常进行捕获,但是由于Controller中的方法众多,会导致代码臃肿。
方案二是定义一个全局异常处理器,将全局的异常进行捕获,这样简单优雅,推荐使用。
三.全局异常处理器
当Controller接收到异常后,会交给全局异常处理器进行处理。要定义一个全局异常处理器,首先要声明@RestControllerAdvice注解, @RestControllerAdvice = @ControllerAdvice + @ResponseBody。这样@ResponseBody注解会将全局异常处理器的返回值作为JSON格式的对象返回给前端。
在其中使用@ExceptionHandler注解来通过ExceptionHandler中的value属性来定义我们要捕获的异常类型,Exception.class代表捕获所有异常。
将异常捕获后打印出异常的堆栈信息,然后返回错误的响应结果给前端。
package com.gjw.exception;import com.gjw.pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice // 代表定义全局异常处理器 @RestControllerAdvice = @ControllerAdvice + @ResponseBody
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class) // 通过ExceptionHandler中的value属性来定义我们要捕获的异常类型,Exception.class代表捕获所有异常public Result exceptionHandler(Exception ex) {ex.printStackTrace();return Result.error("对不起,操作失败,请联系管理员!");}
}