金刀的博客 | SpringBoot Exception 异常处理入门篇

SpringBoot中异常处理方式

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

  1. 自定义错误错误页面
    2.@ExceptionHandle注解处理异常
    3.@ControllerAdvice&@ExceptionHandler注解处理异常
  2. 配置SimpleMappingExceptionResolver处理异常
  3. 自定义HandlerExceptionResolver类处理异常

自定义错误页面

SpringBoot默认的处理异常的机制:

SpringBoot默认已经提供了一套处理异常的机制,一旦程序中出现了异常。SpringBoot会向"/error"的URL发送请求。在SpringBoot中提供了一个"BasicExceptionController"来处理**/error**请求,然后跳转到默认显示异常的页面来展示异常的信息。

金刀的博客 | SpringBoot Exception 异常处理入门篇_第1张图片

如果需要将所有的异常统一跳转到自定义的错误页面,则可以在resources目录下创建一个名为"error"的页面。(名称必须为error)

金刀的博客 | SpringBoot Exception 异常处理入门篇_第2张图片

  • HTML代码片段

<html>
<head>
<meta charset="UTF-8">
<title>自定义错误提示页title>
<style type="text/css">
.font-center{color: red;}
style>
head>
<body>
<h2 align="center">
	<font class="font-center">出错啦,联系管理员吧~~~font><br/>
	<font class="font-center" th:text="${exception}">font>
h2>
body>
html>

@ExceptionHandler

  • JAVA后端代码片段
@Controller
public class ExceptionHandleController {

	@RequestMapping(value = "/number") 
	public String numberResult() {
		System.out.println(10/0);
		return "index"; 
	}
	
	/**
	 * java.lang.ArithmeticException
	 * 该方法需要返回一个ModelAndView,目的是可以让我们封装异常信息以及视图的指定
	 * @param e	将产生的异常对象注入到方法中
	 * @return
	 */
	@ExceptionHandler(value = {java.lang.ArithmeticException.class})
	public ModelAndView arithmeticExceptionHandler(Exception e) {
		// 获取ModelAndView实例
		ModelAndView mav = new ModelAndView();
		// 设置异常的错误提示
		mav.addObject("error", "不能除以零呦~~~");
		// 返回的视图文件名
		mav.setViewName("arithmetic-exception");
		return mav;
	}
	
}
  • HTML代码片段

<html>
<head>
<meta charset="UTF-8">
<title>404 pagetitle>
head>
<body>
<h2 align="center">
	<font class="font-center" th:text="${error}">font>
h2>
body>
html>

注意

使用@Controler注解时,可能存在异常的代码块要和@ExceptionHandler的方法需要在同一个类中,否则无法捕获该异常,如果需要在其他类中捕获该异常,则需要在@ExceptionHandler所在类上加上@ControllerAdvice注解声明;

@ExceptionHandler无法捕获模板渲染时的异常,例如:org.thymeleaf.exceptions.TemplateInputException异常

##@ControllerAdvice&@ExceptionHandler注解处理异常

该处理异常形式可以捕获其他控制器(Controller)所发生的异常,解决了@ExceptionHandler只能捕获所在控制器(Controller)异常的局限性

定义全局异常类(在类上需要添加**@ControllerAdvice**注解标识)

  • Java后端代码片段
/**
 * 	全局异常处理类
 * @author 金刀
 *
 */
@ControllerAdvice // 即把@ControllerAdvice注解内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的 @RequestMapping注解的方法。
public class GlobalException {
	/**
	 * java.lang.ArithmeticException
	 * 该方法需要返回一个ModelAndView,目的是可以让我们封装异常信息以及视图的指定
	 * @param e	将产生的异常对象注入到方法中
	 * @return
	 */
	@ExceptionHandler(value = {java.lang.ArithmeticException.class})
	public ModelAndView arithmeticExceptionHandler(Exception e) {
		// 获取ModelAndView实例
		ModelAndView mav = new ModelAndView();
		// 设置异常的错误提示
		mav.addObject("error", "不能除以零呦~~~");
		// 返回的视图文件名
		mav.setViewName("arithmetic-exception");
		return mav;
	}
}

自定义HandlerExceptionResolver类处理异常

在自定义的全局异常处理类中实现HandlerExceptionResolver接口,并且异常类需要使用**@Configuration**注解标识声明

  • Java代码片段
/**
 * 	自定义全局异常
 * 	通过实现HandlerExceptionResolver接口实现全局异常处理功能
 * @author 金刀
 *
 */
@Configuration
public class CustomizeGlobalException implements HandlerExceptionResolver{

	@Override
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception ex) {
		// 获取ModelAndView实例,用于设置返回的视图和model对象内容
		ModelAndView mav = new ModelAndView();
		
		/* ------------通过instanceof判断异常参数所属的异常类型,并处理异常操作--------------- */
		
		/**
		 * 处理算数异常,返回到算数异常提示页面
		 */
		if(ex instanceof ArithmeticException) {
			mav.setViewName("exception");
			mav.addObject("error", "被除数不能为零哟~~~");
		}
		
		/**
		 * 处理空指针异常
		 */
		if(ex instanceof NullPointerException) {
			mav.setViewName("exception");
			mav.addObject("error", "内容不能为空");
		}

		return mav;
	}
}
  • HTML代码片段

<html>
<head>
<meta charset="UTF-8">
<title>404 pagetitle>
head>
<body>
<h2 align="center">
	<font class="font-center" th:text="${error}">font>
h2>
body>
html>
  • 附上一张最终的项目结构图
    金刀的博客 | SpringBoot Exception 异常处理入门篇_第3张图片

你可能感兴趣的:(Spring)