SpringBoot对异常处理的常用方式
目录
1.测试环境搭建(springboot工程)
pom文件关键依赖
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
application.yml文件
spring:
application:
name: springboot-exhandler-demo
# thymeleaf模板引擎配置
thymeleaf:
mode: HTML5
prefix: classpath:/templates/html/
suffix: .html
cache: false
encoding: UTF-8
enabled: true
server:
port: 8080
启动类
@SpringBootApplication
public class SpringbootExhandlerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootExhandlerDemoApplication.class, args);
}
}
错误提示页面:err_page.html(文件放在resources/templates/html/目录下)
<!DOCTYPE html>
<html lang="zh" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>错误提示页面</title>
</head>
<body>
<h1>出错了,请与管理员联系!</h1>
出错信息: <span th:text="${error} ?: '可能没有传递异常信息,获取出错信息失败!' " th:value="获取详细信息失败"></span>
</body>
</html>
2.异常处理
2.1 利用@ExceptionHandle注解处理
直接在控制器类中使用@ExceptionHandler注解。
目录结构:
TestController
@Controller
public class TestController {
/**
* 该控制器不具备实际的跳转首页index功能,目的仅仅产生ArithmeticException异常.
* @return java.lang.String
*/
@RequestMapping("/index")
public String toIndex(){
// 创造ArithmeticException异常
int a = 10 / 0;
return "index";
}
/**
* 处理ArithmeticException异常,在err_page页面显示异常详细信息.
* @param ex 异常对象,即捕获到的ArithmeticException对象;该对象会被疯转到ModelAndView中
* @return org.springframework.web.servlet.ModelAndView
*/
@ExceptionHandler(value = {ArithmeticException.class})
public ModelAndView rithmeticExceptionHandler(Exception ex){
ModelAndView mv = new ModelAndView();
mv.addObject("error", ex.toString());
mv.setViewName("err_page");
return mv;
}
}
2.2 利用@ControllerAdvice配合@ExceptionHandler注解处理
新建增强的控制器类处理异常。
目录结构:
TestController
@Controller
public class TestController {
/**
* 该控制器不具备实际的跳转首页index功能,目的仅仅产生ArithmeticException异常.
* @return java.lang.String
*/
@RequestMapping("/index")
public String toIndex(){
// 创造ArithmeticException异常
int a = 10 / 0;
return "index";
}
}
GlobalExceptionHandler
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理ArithmeticException异常,在err_page页面显示异常详细信息.
* @param ex 异常对象,即捕获到的ArithmeticException对象;该对象会被疯转到ModelAndView中
* @return org.springframework.web.servlet.ModelAndView
*/
@ExceptionHandler(value = {ArithmeticException.class})
public ModelAndView rithmeticExceptionHandler(Exception ex){
ModelAndView mv = new ModelAndView();
mv.addObject("error", ex.toString());
mv.setViewName("err_page");
return mv;
}
}
2.3 利用SimpleMappingExceptionResolver处理
通过创建SimpleMappingExceptionResolver实例,通过配置类GlobalExceptionConfig注入到Spring容器中
目录结构:
TestController
@Controller
public class TestController {
/**
* 该控制器不具备实际的跳转首页index功能,目的仅仅产生ArithmeticException异常.
* @return java.lang.String
*/
@RequestMapping("/index")
public String toIndex(){
// 创造ArithmeticException异常
int a = 10 / 0;
return "index";
}
}
GlobalExceptionConfig
/**
* 通过SimpleMappingExceptionResolver做全局异常处理,跳转的页面一般是知道该异常信息的指定描述页面.
*/
@Configuration
public class GlobalExceptionConfig {
@Bean
public SimpleMappingExceptionResolver simpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
//添加异常与视图映射;mappings的key是异常全限定名,value是视图名称;mappings可以添加多个映射关系
mappings.put("java.lang.ArithmeticException", "err_page");
//mappings.put("java.lang.NullPointerException","空指针异常视图名");
resolver.setExceptionMappings(mappings);
return resolver;
}
}
2.4 利用HandlerExceptionResolver处理
创建springboot配置类GlobalExceptionConfig,该类实现HandlerExceptionResolver接口,重写resolveException()方法
目录结构:
GlobalExceptionConfig
/**
* 通过实现了HandlerExceptionResolver接口的配置类做全局异常处理.
*/
@Configuration
public class GlobalExceptionConfig implements HandlerExceptionResolver {
/**
* description:.
* @param request request对象
* @param response response对象
* @param handler 这里指的是发生异常的控制器
* @param ex 异常信息
* @return org.springframework.web.servlet.ModelAndView
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv = new ModelAndView();
//异常判断和视图处理
if (ex instanceof ArithmeticException){
mv.addObject("error", ex.toString());
mv.setViewName("err_page");
}
if (ex instanceof NullPointerException){
mv.addObject("error", ex.toString());
mv.setViewName("err_null");
}
// ...
return mv;
}
}
注:Demo中只使用了一个错误页面;实际中错误页面根据自己实际情况而定,不同的错误页面可以自己定制,没必要跳转到同一个页面