Spring Boot异常处理

 SpringBoot 中对于异常处理提供了五种处理方式

自定义错误页面

SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会像/error url 发送请求。在 springBoot 中提供了一个BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。
 
如果我们需要将所有的异常同一跳转到自定义的错误页面,要再src/main/resources/templates 目录下创建 error.html 页面。
注意:名称必须叫 error
 
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>error</title>
</head>
<body>
<h1>页面崩溃了呢,主人~~~~</h1>
</body>
</html>

 

@ExceptionHandle 注解处理异常
Controller
package com.bjsxt.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SpringController {

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

    }

    @RequestMapping("/show2")
    public String show(){
        int a=10/0;
        return "index";

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

}

 

前端页面

error1

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>error</title>
</head>
<body>
<h1>页面崩溃了呢,主人~~~~</h1>
<span th:text="${error}"></span>
<h1>空指针异常!!!!</h1>
</body>
</html>

 

error2

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>error</title>
</head>
<body>
<h1>页面崩溃了呢,主人~~~~</h1>
<span th:text="${error}"></span>
<h1>其他异常!!!!</h1>
</body>
</html>

 

@ControllerAdvice+@ExceptionHandler 注解处理异常
需要创建一个能够处理异常的全局异常类。在该类上需要添加@ControllerAdvice 注解

 

GolableException.java

package com.bjsxt.exception;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Properties;

@ControllerAdvice
public class GolableException implements HandlerExceptionResolver {
 
    /**
     * java.lang.ArithmeticException
     * 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定
     * 参数Exception e:会将产生异常对象注入到方法中
     */
    @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;
    }

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

}

 

配置 SimpleMappingExceptionResolver 处理异常
在全局异常类中添加一个方法完成异常的同一处理

GolableException.java

package com.bjsxt.exception;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Properties;


@Configuration
public class GolableException implements HandlerExceptionResolver {


    @Bean
    public SimpleMappingExceptionResolver geyErrorHtml(){
        SimpleMappingExceptionResolver resolver=new SimpleMappingExceptionResolver();
        Properties proper = new Properties();
        proper.put("java.lang.NullPointerException","error1");
        proper.put("java.lang.ArithmeticException","error2");
        resolver.setExceptionMappings(proper);
        return resolver;
    }
}

 

自定义 HandlerExceptionResolver 类处理异常
 
需要再全局异常处理类中实现HandlerExceptionResolver接口
 

GolableException.java

package com.bjsxt.exception;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Properties;


@Configuration
public class GolableException implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mav=new ModelAndView();
        if (e instanceof ArithmeticException){
            mav.setViewName("error2");
        }
        if (e instanceof NullPointerException){
            mav.setViewName("error1");
        }
        mav.addObject("error",e.toString());
        return mav;
    }

}

 

posted @ 2019-12-11 08:56  sakura-yxf  阅读(216)  评论(0)    收藏  举报