SpringBoot 异常处理的几种方式

SpringBoot 异常处理的多种方式:

方式1:自定义错误界面

SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。 一旦程序中出现了异常 SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个 叫 BasicExceptionController 来处理/error 请求,然后
如果我们需要将所有的异常同一跳转到自定义的错误页面,需要再 src/main/resources/templates 目录下创建 error.html 页面。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"> <title>错误提示页面</title> </head>
<body>
出错了
<span>我是自定义错误界面</span>
</body>
</html>

方式2:@ExceptionHandle 注解处理异常

@Controller
public class Demo01Controller {
    @RequestMapping("/demo01")
    public String showInfo1(){
        String str = null;
        //会 出错  报空指针异常
        str.length();
        return "index";
    }
    @RequestMapping("/demo02")
    public String showInfo2(){
        int a = 10 / 0 ;
        return "index";
    }

    /**
     *   java.lang.ArithmeticException
     * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视
     * 图的指定
     * @param  e 参数 Exception e:会将产生异常对象注入到方法中
     * @return
     */
    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView arithmeticExceptionHandler(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error", e.toString());
        mv.setViewName("error1");
        return mv;
    }
    /**
     * 处理 NullPointException 的处理
     * @param e
     * @return
     */
   @ExceptionHandler(value = {NullPointerException.class})
    public ModelAndView nullpointException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error2");
        return mv;
    }

页面信息:

error1.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>异常-ArithmeticException界面</title>
</head>
<body>
  出错了 ArithmeticException
  <span th:text="${error}"> </span>
</body>
</html>

error2.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>异常-NullPointerException 界面</title>
</head>
<body>
  出错了  NullPointerException
  <span th:text="${error}"> </span>
</body>
</html>

方式3:@ControllerAdvice+@ExceptionHandler 注解处理异常

/**
 * 全局 异常处理类 加注解 @ControllerAdvice
 */
@org.springframework.web.bind.annotation.ControllerAdvice
public class Global01Exception {
    /**
     * 处理异常的方式
     * @param e
     * @return
     */
    @ExceptionHandler(value = {java.lang.NullPointerException.class})
    public ModelAndView arithmeticExceptionHandler(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error", e.toString());
        mv.setViewName("error1");
        return mv;
    }
}

方式4:配置 SimpleMappingExceptionResolver 处理异常

/**
 * @desc  通过 SimpleMappingExceptionResolver 做全局异常处理
 */
@Configuration  
public class Global02Exception {

    /**
     * 方法的返回值 类型必须是  SimpleMappingExceptionResolver
     * @return
     */
    @Bean
    public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties mappings = new Properties();
        /**
         * 参数1 异常的类型  要是全类名
         * 参数2 视图名称
         */
        mappings.put("java.lang.NullPointerException", "error1");
        mappings.put("java.lang.ArithmeticException", "error2");
        //设置异常与视图映射信息的
        resolver.setExceptionMappings(mappings);
        return resolver;
    }
}

方式5:自定义 HandlerExceptionResolver 类处理异常

/**
 * @desc  通过实现 HandlerExceptionResolver 接口做全局异常处理
 */
@Configuration
public class Global03Exception implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        //返回视图
        ModelAndView mv = new ModelAndView();
        //判断 不同异常类型
        if (e instanceof ArithmeticException){
            mv.setViewName("error1");
        }
        if (e instanceof NullPointerException){
            mv.setViewName("error2");
        }
        mv.addObject("error",e.getMessage());
        return mv;
    }
}

例子中使用了 thymeleaf模板 配置如下

# 模板加载
spring.thymeleaf.cache=true
spring.thymeleaf.encoding=utf-8
spring.thymeleaf.mode=HTML
spring.thymeleaf.suffix=.html
spring.thymeleaf.prefix=classpath:/templates/
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值