在项目开发中,肯定少不了异常的出现,作为后台开发人员,我们总是在不停的写各种接口提供给前端调用,然而不可避免的,当后台出现BUG时,前端总是丑陋的讲错误信息直接暴露给用户,这样的用户体验想必是相当差的
先写一个错误请求
@GetMapping("api/error")
public Object error(){
int a=10/0;
return a;
}
使用postman测试接口,结果如下
如果未添加全局异常处理,将会使用默认的异常处理,返回结果,返回的结果和自己的数据结构有很大的差异,对于前端处理返回结果也很麻烦,所以最好可以做个全局异常处理
@ControllerAdvice 处理全局异常
在处理controller
层抛出的自定义异常时,可以实现@ControllerAdvice
注解捕获。@ExceptionHandler
:统一处理某一类异常,从而能够减少代码重复率和复杂度
该注解作用对象为方法,并且在运行时有效,value()
可以指定异常类。异常参数:包括一般的异常或特定的异常(即自定义异常),如果注解没有指定异常类,会默认进行映射。@ControllerAdvice
:异常集中处理,更好的使业务逻辑与异常处理剥离开
全局异常处理代码如下:
@ControllerAdvice
public class GloablExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
public Object handleException(Exception e) {
// 记录错误信息
String msg = e.getMessage();
if (msg == null || msg.equals("")) {
msg = "服务器出错";
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("message", msg);
return jsonObject;
}
}
我这里直接用fastjson
返回json
数据,也可以自定义返回实体(比较推荐).
如果是想返回页面的话可以返回ModelAndView
的对象,并且不用加@ResponseBody
如果全部异常处理返回json
,那么可使用@RestControllerAdvice
代替@ControllerAdvice
,这样在方法上就可以不需要添加 @ResponseBody
。
下面我们再次来看看异常的返回
这样就按照我们自定义的格式返回异常信息了,返回的数据结构推荐自定义返回实体。