springboot异常处理的五种方式

springboot异常处理-自定义错误页面

SpringBoot默认的处理异常机制:一旦程序中出现了异常,springboot会向/error的url发送请求。在springboot中提供了一个名为BasicExceptionController来处理/error的请求,将错误信息进行收集,跳转到默认显示异常的页面。

  • 将所有的异常跳转到同一个自定义异常页面。
  • templates目录下新建一个名为error.html的页面,必须叫error

在这里可以通过exception的key获取到错误信息。

<body>
	出错了,请于管理员联系!
	<span th:text="${exception }"></span>
</body>
  • controller
@Controller
public class DemoController {
	@RequestMapping("/show")
	public String showPage() {
		String str = null;
		str.length();
		return "index";
	}
	
	@RequestMapping("/show2")
	public String showPage2() {
		int a = 10/0;
		return "index";
	}
}
  • pom文件
<properties>
	<java.version>1.8</java.version>
	<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
 	<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>

	<dependencies>
		<!-- spring-boot启动器 -->
	<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
   <!-- thymeleaf启动器 -->
	<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>
</dependencies>
  • 缺点:不能根据不同错误跳转不同页面,只能跳转同一个页面。

springboot异常处理-@ExceptionHandler

创建一个返回值为ModelAndView的controller,使用注解@ExceptionHandler进行异常处理。

  • pom文件
<properties>
  		<java.version>1.8</java.version>
  		<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    	<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
  	</properties>
  
   	<dependencies>
  			<!-- spring-boot启动器 -->
	  	<dependency>
	      <groupId>org.springframework.boot</groupId>
	      <artifactId>spring-boot-starter-web</artifactId>
	    </dependency>
		    <!-- thymeleaf启动器 -->
	  	<dependency>
	      <groupId>org.springframework.boot</groupId>
	      <artifactId>spring-boot-starter-thymeleaf</artifactId>
	    </dependency>
</dependencies>
  • 控制器
@Controller
public class DemoController {
	/**
	 * java.lang.NullPointerException
	 */
	@RequestMapping("/show")
	public String showPage() {
		String str = null;
		str.length();
		return "index";
	}
	/**
	 * java.lang.ArithmeticException
	 */
	@RequestMapping("/show2")
	public String showPage2() {
		int a = 10/0;
		return "index";
	}
	
	/**
	 * 该方法返回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;
	}
	/**
	 * 该方法返回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:处理java.lang.ArithmeticException异常;
error2:处理java.lang.NullPointerException异常;

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error1-错误提示页面-ArithmeticException</title>
</head>
<body>
	出错了,请于管理员联系!
	<span th:text="${error }"></span>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error2-错误提示页面-NullPointerException</title>
</head>
<body>
	出错了,请于管理员联系!
	<span th:text="${error }"></span>
</body>
</html>
  • 缺点:当需要处理的异常数量多时,需要写多个控制器方法或者进行异常类型的判断处理,且不具备跨controller的能力,会造成代码的冗余。

springboot异常处理-@ControllerAdvice+@ExceptionHandler

该方式进行处理异常时,可以对所有的controller起作用,很大程度上减少了代码冗余。

  • pom文件,同上。
  • 新建全局Exception类。如com.x.exception.GolbalException

1、@ControllerAdvice注解标记该类;
2、将之前@ExceptionHandler标记的异常处理的controller方法放入该类。
3、此后所有的controller类出现该类中的异常时,会根据该类中的方法进行处理。

@ControllerAdvice
public class GolbalException {
	/**
	 * 该方法返回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;
	}
	/**
	 * 该方法返回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;
	}
}
  • 新建两个controller进行测试。

DemoController和DemoController2。

@Controller
public class DemoController {
	/**
	 * java.lang.NullPointerException
	 */
	@RequestMapping("/show1")
	public String showPage() {
		String str = null;
		str.length();
		return "index";
	}
	/**
	 * java.lang.ArithmeticException
	 */
	@RequestMapping("/show2")
	public String showPage2() {
		int a = 10/0;
		return "index";
	}
}
@Controller
public class DemoController2 {
	/**
	 * java.lang.NullPointerException
	 */
	@RequestMapping("/show3")
	public String showPage() {
		String str = null;
		str.length();
		return "index";
	}
	/**
	 * java.lang.ArithmeticException
	 */
	@RequestMapping("/show4")
	public String showPage2() {
		int a = 10/0;
		return "index";
	}
}
  • 页面:

error1:处理java.lang.ArithmeticException异常;
error2:处理java.lang.NullPointerException异常;

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error1-错误提示页面-ArithmeticException</title>
</head>
<body>
	出错了,请于管理员联系!
	<span th:text="${error }"></span>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error2-错误提示页面-NullPointerException</title>
</head>
<body>
	出错了,请于管理员联系!
	<span th:text="${error }"></span>
</body>
</html>

springboot异常处理-配置类:SimpleMappingExceptionResolver

1、对上一种方式@ControllerAdvice+@ExceptionHandler的简化。
2、 使用@Configuration@Bean注解实现。

  • pom文件,同上;
  • controller,同上;
  • 全局异常类,如com.x.exception.GolbalException
/**
 * @Configuration作用:
 * springboot在启动时会对该类进行加载,该类中凡是有@Bean注解的都会被加载。
 */
@Configuration
public class GolbalException {
	/**
	 * 该方法返回值类型必须是SimpleMappingExceptionResolver
	 */
	@Bean
	public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
		SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
		
		Properties mappings = new Properties();
		/**
		 * 参数一:异常的类型,必须给定异常类型的全名。
		 * 参数二:视图名称,
		 */
		mappings.put("java.lang.ArithmeticException", "error1");
		mappings.put("java.lang.NullPointerException", "error2");
		
		//将视图和异常映射对象传递给SimpleMappingExceptionResolver
		resolver.setExceptionMappings(mappings);
		
		return resolver;
	}
}
  • 页面,同上。

  • 缺点:同第三种方式相比,该方式只是做了视图的映射,但无法返回异常对象,也就是在页面中不能通过<span th:text="${error }"></span>获取异常信息。


springboot异常处理-自定义HandlerExceptionResolver

1、对第四种的优化,可以返回异常对象。
2、通过@ConfigurationHandlerExceptionResolver接口实现。

  • pom文件,同上。
  • controller,同上。
  • 全局异常类,如com.x.exception.GolbalException
/**
 * @Configuration作用:
 * springboot在启动时会对该类进行加载,该类中凡是有@Bean注解的都会被加载。
 */
@Configuration
public class GolbalException implements HandlerExceptionResolver{

	@Override
	public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
			Exception e) {
		ModelAndView mv = new ModelAndView();
		
		if(e instanceof NullPointerException) {
			mv.setViewName("error2");
		}
		
		if(e instanceof ArithmeticException) {
			mv.setViewName("error1");
		}
		mv.addObject("error", e.toString());
		return mv;
	}
}
  • 页面,同上。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值