在项目开发过程中难免遇到异常,如果不进行处理的话直接返回给前端的话就会非常不友好,这里我们就进行SpringBoot异常处理的讲解,官方文档:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-error-handling
首先我们先制造一个异常看看返回是什么,新建一个ExceptionController:
@RestController
public class ExceptionController {
@GetMapping("/v1/api/testException")
public Object index() {
int i= 1/0;
return new User(11, "sfsfds", "1000000", new Date());
}
}
访问接口查看结果发现报错:
这样返回给前端就是非常不友好的,这时候我们就要进行一个全局的异常处理,新建一个handler,加上注解@ControllerAdvice(@ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody,如果是返回一个逻辑视图就直接加@ControllerAdvice,不要加@ResponseBody),如果发生异常那么就会走到这里
@RestControllerAdvice
public class ExceptionHandler {
private static final Logger LOG = LoggerFactory.getLogger(ExceptionHandler.class);
//捕获全局异常,处理所有不可知的异常
//@ResponseBody
@org.springframework.web.bind.annotation.ExceptionHandler(value = Exception.class)
Object handleException(Exception e,HttpServletRequest request){
LOG.error("url {}, msg {}",request.getRequestURL(), e.getMessage());
Map map = new HashMap<>();
map.put("code", 100);
map.put("msg", e.getMessage());
map.put("url", request.getRequestURL());
return map;
}
}
下面我们进行启动访问:
这样返回就非常直观了,前端可以直接根据我们返回的code进行对应的操作!
1.先新建一个异常类MyException
public class MyException extends RuntimeException {
public MyException(String code, String msg) {
this.code = code;
this.msg = msg;
}
private String code;
private String msg;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
2.在ExceptionHandler加上一个方法:
/**
* 功能描述:处理自定义异常
* @return
*/
@org.springframework.web.bind.annotation.ExceptionHandler(value=MyException.class)
Object handleMyException(MyException e,HttpServletRequest request){
//返回json数据,由前端去判断加载什么页面
Map map = new HashMap<>();
map.put("code", e.getCode());
map.put("msg", e.getMsg());
map.put("url", request.getRequestURL());
return map;
}
这时候程序中抛出一个MyExcepiton的时候就会进入到这个处理方法,我们可以自定义很多个异常,在这边进行逻辑处理就行,
下面新建一个接口手动抛一个MyException异常进行测试:
/**
* 功能描述:模拟自定义异常
* @return
*/
@RequestMapping("/api/v1/myext")
public Object myexc(){
throw new MyException("499", "my ext异常");
}
访问测试,发现我们自定义的异常已经起作用了
自定义异常的流程与全局异常一样,都是代码中抛出了一个异常,被Spring捕获到了,然后就会到有@ControllerAdvice注解的类中,找到该类定义的异常处理办法,也就是抛出的异常匹配value值,如下图:匹配到之后就返回一个自定义的页面,不过一般现在是前后端分离,直接返回一个json数据由前端进行处理就行。
源码地址:https://gitee.com/xuxinsunqizheng/SpringBoot2.0.git