- @ExceptionHandler 表示拦截异常
- @ControllerAdvice 是 controller的一个辅助类,最常用的就是作为全局异常处理的切面类
- @ControllerAdvice 可以指定扫描范围
- @ControllerAdvice 约定了几种可行的返回值,如果是直接返回 model 类的话,需要使用 @ResponseBody 进行json 转换
- 返回 String,表示跳到某个 view
- 返回 modelAndView
- 返回 model + @ResponseBody
全局捕获异常返回的响应一般为两种形式
json数据
html页面
方式一,返回json形式
IndexController .java
@RestController
public class IndexController {
@RequestMapping("/index")
public String index(int num){
int i = 1 / num;
return "success"+i;
}
}
GlobalExceptionHandler .java
@ControllerAdvice(basePackages = "com.reason.controller")
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String, Object> exceptionHandler() {
Map<String, Object> map = new HashMap<>();
map.put("errorCode", "500");
map.put("errorMsg", "全局捕获异常系統错误!");
return map;
}
}
方式二,返回页面形式
pom.xml
<!-- 引入freeMarker的依赖包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
application.properties
spring.freemarker.allow-request-override=false
spring.freemarker.cache=true
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath:/templates/
IndexController.java
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(int num, ModelMap modelMap){
int result = 1 / num;
modelMap.addAttribute("result", result);
return "index";
}
}
GlobalExceptionHandler.java
@ControllerAdvice(basePackages = "com.reason.controller")
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ModelAndView exceptionHandler() {
ModelAndView modelAndView = new ModelAndView("500");
return modelAndView;
}
}
500.ftl
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
</head>
<body>
<h1>服务器向你抛出了一只BUG,请通知程序猿赶紧修复!!!</h1>
</body>
</html>
index.ftl
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
</head>
<body>
${result}
</body>
</html>
运行截图