SpringBoot异常处理的5种方式

Springboot的五种异常错误处理方式
一 自定义错误页面
只需要在resources/templates/目录下新建一个名为error的视图页面即可,当出现异常时,SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个
叫 BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。
在这里插入图片描述
Controller类中
在这里插入图片描述
页面中
在这里插入图片描述
效果
在这里插入图片描述
缺点:拦截所有错误,不灵活
二 使用注解@ExceptionHandler处理
在controller类中添加错误类,返回ModelandView,并使用@ExceptionHandler(value={})注解,value中标注错误类型,当发生错误时会自动跳转到你设置的错误页面中
Controller类

@Controller
public class ExceptionController {

    @RequestMapping("/zidingyi")
    public String zidingyi(){
        int i=100/0;
        return "index";
    }

    @RequestMapping("/zidingyi1")
    public String zidingyi1(){
        String str=null;
        str.length();
        return "index";
    }

    //定义错误处理,value中指定错误类型
    @ExceptionHandler(value={java.lang.ArithmeticException.class})
    public ModelAndView exception1(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error1");
        return mv;
    }

    //定义错误处理,value中指定错误类型
    @ExceptionHandler(value={java.lang.NullPointerException.class})
    public ModelAndView exception2(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error2");
        return mv;
    }

}

错误页面

页面一
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>这里是ArithmeticException错误页面</title>
</head>
<body>
    发生错误啦 <span th:text="${error}"></span>
</body>
</html>

页面二
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>这里是NullPointerException错误页面</title>
</head>
<body>
    发生错误啦 <span th:text="${error}"></span>
</body>
</html>

缺点:只能在一个controller中使用,不能跨controller使用

三 使用注解@controllerAdvice处理
定义一个类用来装所有的错误类型,并且使用@controllerAdvice注解
在这里插入图片描述
Controller类
在这里插入图片描述
AllException类

package com.ht.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

/**
 * Created by wqx on 2019/3/20.
 */
@ControllerAdvice
public class AllException {
    @ExceptionHandler(value={java.lang.ArithmeticException.class})
    public ModelAndView exception1(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error1");
        return mv;
    }

    //定义错误处理,value中指定错误类型
    @ExceptionHandler(value={java.lang.NullPointerException.class})
    public ModelAndView exception2(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error2");
        return mv;
    }

}

缺点:如果有多个错误还是要写多个方法,代码重复严重

四 使用@Configuration注解处理
新建类,在类中使用@Configuration注解,在类中定义方法,方法使用@Bean注解,并且返回值为:SimpleMappingExceptionResolver
在这里插入图片描述
AllException2类:

package com.ht.exception;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import java.util.Properties;

/**
 * Created by wqx on 2019/3/20.
 */
//第四种方法:使用@Configuration注解和@Bean注解,将所有的错误都定义到一个方法中,发生错误时,
// 会根据判断自动跳转到指定错误页面
@Configuration
public class AllException2 {

    // 该方法必须要有返回值。返回值类型必须是:SimpleMappingExceptionResolver

     @Bean
    public SimpleMappingExceptionResolver toexception(){
        SimpleMappingExceptionResolver resolver=new SimpleMappingExceptionResolver();
         Properties mapping=new Properties();
         //参数一:错误类型 参数二:指定跳转的错误页面
         mapping.put("java.lang.ArithmeticException","error1");
         mapping.put("java.lang.NullPointerException","error1");
         resolver.setExceptionMappings(mapping);
         return resolver;
    }

}

Controller类

package com.ht.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * Created by wqx on 2019/3/20.
 */

@Controller
public class ExceptionController {

    @RequestMapping("/zidingyi")
    public String zidingyi(){
        int i=100/0;
        //第一种方法:自定义错误页面,发生错误时自动跳转,页面名称必须为error,放在templates目录下
        return "index";
    }

    @RequestMapping("/zidingyi1")
    public String zidingyi1(){
        String str=null;
        str.length();
        return "index";
    }

缺点:不能将错误信息传递到页面中

五 自定义 HandlerExceptionResolver 类处理异常
新建类,使用Configuration注解并且实现HandlerExceptionResolver接口,实现方法
在这里插入图片描述
AllException类

package com.ht.exception;

import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by wqx on 2019/3/20.
 */
//第五种方法:使用Configuration注解并且实现HandlerExceptionResolver接口
@Configuration
public class AllException3 implements HandlerExceptionResolver{


    @Nullable
    @Override
    public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, @Nullable 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.toString());
        return mv;
    }
}

Controller类
在这里插入图片描述
推荐使用第五种方法,既可以将错误定义到一个方法中,又可以传递错误信息到错误页面中

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值