SpringBoot默认处理异常的方式
SpringBoot提供了一套默认的处理异常的机制,使用时只需自定义错误页面即可。 SpringBoot 默认的异常处理机制:在 SpringBoot 中提供了一个 BasicExceptionController 来处理 /error 请求,一旦程序中出现了异常, SpringBoot 就会请求 /error 的 url ,然后跳转到默认显示该异常的页面并展示异常信息。
自定义异常页面,就是在目录 src/main/resources/templates/ 下创建一个error 页面文件,可以是 jsp 也可以是 html 。
具体步骤:
(1)在templates目录下创建一个error.html页面。只要后台资源发生了异常(不管是什么异常),都统统的交给error页面来处理;
(2)如果需要对不同的异常做不同的处理,我们可以将错误页面以错误状态码.html 命名,放在模板引擎文件夹里面的 error文件夹下,发生哪种状态码的错误就会响应对应的页面。
例如:我们可以使用3xx、4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,优先寻找精确的状态 码.html
页面能获取的信息:
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里
使用@ExceptionHandler注解处理
// 处理算术异常
@ExceptionHandler(value = {java.lang.ArithmeticException.class})
public ModelAndView handleArithmeticException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());//向页面展示错误信息
mv.setViewName("error1");
return mv;
}
//处理空指针异常
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView handleNullPointerException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());//向页面展示错误信息
mv.setViewName("error1");
return mv;
}
//处理数组下标越界异常
@ExceptionHandler(value = {java.lang.ArrayIndexOutOfBoundsException.class})
public ModelAndView handleArrayIndexOutOfBoundsException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());//向页面展示错误信息
mv.setViewName("error1");
return mv;
}
使用@ExceptionHandler注解处理的优缺点:
优点:可以自定义异常信息存储的key,自定义跳转视图的名称
缺点:需要编写大量的异常处理方法,不能跨controller,如果两个controller中出现同样的异常,需要重新编写异常处理的方法
使用@ControllerAdvice+@ExceptionHandler全局异常处理
编写异常处理类(全局):
@ControllerAdvice //标识当前类是一个全局异常处理类
public class GlobalException {
// 处理算术异常
@ExceptionHandler(value = {java.lang.ArithmeticException.class})
public ModelAndView handleArithmeticException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());//向页面展示错误信息
mv.setViewName("error1");
return mv;
}
//处理空指针异常
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView handleNullPointerException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());//向页面展示错误信息
mv.setViewName("error1");
return mv;
}
//处理数组下标越界异常
@ExceptionHandler(value = {java.lang.ArrayIndexOutOfBoundsException.class})
public ModelAndView handleArrayIndexOutOfBoundsException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());//向页面展示错误信息
mv.setViewName("error1");
return mv;
}
}
编写处理错误的页面 error1.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>error</h3>
<div th:text="${error}"></div>
</body>
</html>
1
编写controller 测试
@Controller
public class DemoController {
@RequestMapping("demo1")
public String show2(){
int[] arr = new int[3];
arr[100] = 90;
return "success";
}
}
SimpleMappingExceptionResolver处理全局异常
需要将SimpleMappingExceptionResolver注入到spring容器里面
/**
* 全局异常处理器
*/
@Configuration
public class GlobalExceptionHandler {
@Bean
public SimpleMappingExceptionResolver getExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
/**
* 参数1:处理的具体的异常的类型
* 参数2:处理异常需要跳转到的视图
*/
properties.put("java.lang.NullPointerException","error3");
properties.put("java.lang.ArithmeticException","error3");
properties.put("java.lang.ArrayIndexOutOfBoundsException","error3");
resolver.setExceptionMappings(properties);
return resolver;
}
}
自定义 HandlerExceptionResolver 类处理异常
@Configuration
public class MyExceptionReslover implements HandlerExceptionResolver {
/**
* 处理异常的方法
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param ex
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
Object o, Exception ex) {
ModelAndView mv = new ModelAndView();
// 判断不同异常类型,做不同视图跳转
if (ex instanceof ArithmeticException) {
mv.setViewName("error4");
}
if (ex instanceof NullPointerException) {
mv.setViewName("error5");
}
mv.addObject("error", ex.toString());
return mv;
}
}