springboot 五种异常处理方式
Posted activestruggle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 五种异常处理方式相关的知识,希望对你有一定的参考价值。
1.自定义错误页面:
springboot已经内嵌了异常处理的机制,如果发生错误会自动跳转到error界面,默认的error界面为:
我们可以自定义异常界面,但是需要在 src/main/resources/templates 目录下创建 error.html 页面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Title</title> </head> <body> <!--高版本可以通过${message}获取异常信息--> <span th:text="${message}"></span> </body> </html>
优点:
-
springboot自带的一场机制,无需自己配置
缺点:
-
所有的异常信息都在同一个界面
2.在controller类中通过 @ExceptionHandler 注解来新建方法
contorller:
@Controller public class UsersController { @RequestMapping("showInfo") public String showIno() { String str = null; str.length(); return "OK"; } @RequestMapping("showInfo2") public String showIno2() { int a = 10 / 0; return "OK"; }
//value 是一个数组,可以添加多个异常,但只能指向同一个异常页面 @ExceptionHandler(value = {java.lang.NullPointerException.class}) public ModelAndView nullPointExceptionHandler(Exception e) { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("error", e.toString()); modelAndView.setViewName("error1"); return modelAndView; } @ExceptionHandler(value = {java.lang.ArithmeticException.class}) public ModelAndView ArithmeticExceptionHandler(ArithmeticException e) { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("error", e.toString()); modelAndView.setViewName("error2"); return modelAndView; }
error1.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Title</title> </head> <body> 空指针异常 <span th:text="${error}"></span> </body> </html>
error2:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Title</title> </head> <body> <span th:text="${error}"></span> </body> </html>
优点:
-
可以指向多个异常页面
缺点:
-
只能在一个controller类中起作用,代码重用性低
-
一个异常方法对应一个异常页面,当异常页面过多时会导致异常冗余
3.创建一个全局异常类 GlobalException ,通过@ControllerAdvice注解和@ExceptionHandler注解实现全局配置
GlobalException:
/* * 全局异常处理类 * */ @ControllerAdvice public class GlobalException { @ExceptionHandler(value = {java.lang.NullPointerException.class}) public ModelAndView nullPointExceptionHandler(Exception e) { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("error", e.toString()); modelAndView.setViewName("error1"); return modelAndView; } @ExceptionHandler(value = {java.lang.ArithmeticException.class}) public ModelAndView ArithmeticExceptionHandler(ArithmeticException e) { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("error", e.toString()); modelAndView.setViewName("error2"); return modelAndView; } }
优点:
-
可以指向多个异常页面
-
全局配置,代码重用性高
缺点:
-
一个异常方法对应一个异常页面,当异常页面过多时会导致异常冗余
4.配置 SimpleMappingExceptionResolver 处理异常
/* * 全局异常 * */ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver; import java.util.Properties; @Configuration public class GlobalException2 { /* * 此方法返回值必须是SimpleMappingExceptionResolver类型 * */ @Bean public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() { SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver(); Properties properties = new Properties(); /* *参数一:异常类型,并且是全名 * 参数二:视图名称 * */ properties.put("java.lang.NullPointerException", "error3"); properties.put("java.lang.ArithmeticException", "error4"); resolver.setExceptionMappings(properties); return resolver; } }
error3.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Title</title> </head> <body> java.lang.NullPointerException </body> </html>
优点:
-
可以指向多个异常页面
-
全局配置,代码重用性高
-
一个异常方法对应一个异常页面,当异常页面过多时会导致异常冗余
缺点:
-
只能做视图和异常的映射,不能做异常信息的传递,将导致异常信息比较模糊
5.自定义 HandlerExceptionResolver 类处理异常
/* * 自定义HandlerExceptionResolver对象处理异常 * 必须实现HandlerExceptionResolver接口 * */ @Configuration public class GlobalException3 implements HandlerExceptionResolver { /* * httpServletRequest产生异常的请求对象 * httpServletResponse产生异常的响应对象 * handler此次产生异常的handler对象 * e 产生异常的异常对象 * */ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception e) { ModelAndView mv = new ModelAndView(); //判断不同异常类型,做不同视图跳转 if (e instanceof NullPointerException) { mv.setViewName("error5"); } if(e instanceof ArithmeticException){ mv.setViewName("error6"); } mv.addObject("error",e.toString()); return mv; } }
优点:
-
可以指向多个异常页面
-
全局配置,代码重用性高
-
一个异常方法对应一个异常页面,当异常页面过多时会导致异常冗余
-
异常信息详细
以上是关于springboot 五种异常处理方式的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot学习13:springboot异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段
SpringBoot学习14:springboot异常处理方式4(使用SimpleMappingExceptionResolver处理异常)