从零开始学SpringBoot-如何处理异常

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值