您的位置:首页 > 编程语言 > Java开发

SpringBoot异常处理的5种方式

2019-03-20 11:35 337 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/wqx484/article/details/88684392

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类

推荐使用第五种方法,既可以将错误定义到一个方法中,又可以传递错误信息到错误页面中

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: