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类
推荐使用第五种方法,既可以将错误定义到一个方法中,又可以传递错误信息到错误页面中