在项目使用全局异常捕获,可以简化我们的代码,做到异常统一管理返回的效果。本节我们来学学springboot项目中是如何来全局捕获异常。
1、引入Maven依赖
由于本节的实战,我们会学习一下JSON封装返回和视图返回这两种方式。视图返回使用FreeMarker来演练。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!-- FreeMarker依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
2、编写全局异常捕获类
我们可以在启动类同级包以及子级包下新增全局异常捕获类,并在该类上使用注解**@ControllerAdvice**,它是一个Controller的切面。
/**
* @author 小吉
* @description springboot全局异常捕获
* @date 2020/5/29
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Map handler500(Exception e){
e.printStackTrace();
Map map = new HashMap();
map.put("status",false);
map.put("message","服务异常!");
return map;
}
}
3、编写控制器
我们尝试在控制器中加上报错的代码,用来测试一下全局异常的捕获。
/**
* @author 小吉
* @description
* @date 2020/5/29
*/
@RestController
public class IndexController {
@RequestMapping("index")
@ResponseBody
public String index(){
int i = 1 / 0;
return "SpringBoot全局异常捕获";
}
}
启动类
/**
* @author 小吉
* @description springboot启动类
* @date 2020/5/29
*/
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
}
}
启动应用后在控制台上可以看到springboot已经加载好异常处理。
当看到浏览器上返回我们的报错信息,证明全局异常捕获生效。
以上就是全局异常捕获返回json信息。接下来我来介绍视图返回方式。
4、视图返回
我们可以借助ModelAndView来实现视图返回。
/**
* @author 小吉
* @description springboot全局异常捕获
* @date 2020/5/29
*/
@ControllerAdvice
public class GlobalExceptionHandler {
// @ExceptionHandler(Exception.class)
// @ResponseBody
// public Map handler500(Exception e){
// e.printStackTrace();
// Map map = new HashMap();
// map.put("status",false);
// map.put("message","服务异常!");
// return map;
// }
@ExceptionHandler(Exception.class)
public ModelAndView handler500(Exception e){
e.printStackTrace();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message","服务异常!");
modelAndView.setViewName("500");
return modelAndView;
}
}
在src/main/resources下创建templates目录,新建500.ftl
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>