springboot全局异常处理

100 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。​​​​​​​​​​​​​​​ ​

项目目录结构:

1.创建项目,pom文件:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-tomcat</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
	</dependency>
</dependencies>

2.controller:

package com.wyh.controller;

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

@Controller
@RequestMapping("err")
public class ErrorController {

	@RequestMapping("/error")
	@ResponseBody
	public String error() {
		//设置异常
		int a = 1 / 0 ;
		return "welcome";//正常情况下在当前页面显示字符串
	}
}

3.全局异常处理器:当controller中出现了全局异常处理器中定义的异常类型时,就会跳转到异常处理器中的方法对异常进行处理。

package com.wyh.exception;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice//定义一个全局异常处理器
public class MyExceptionHandler {
	
	@ExceptionHandler(value = Exception.class)
	//@ExceptionHandler(value = ArithmeticException.class)//此处是算数异常,也可以直接写算数异常处理器
	public ModelAndView errorHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
		e.printStackTrace();
		ModelAndView mv = new ModelAndView();
		mv.addObject("exception", e);
		mv.addObject("url", request.getRequestURL());
		mv.setViewName("/error.html");//定义返回的视图名称,即html
		return mv;
	}

}

4.静态页面,放在resources/static下(error.html):

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>global exception</title>
</head>
<body>
<h2>sorry,出错了。。。</h2>
</body>
</html>

启动项目,访问 http://localhost:8080/err/error:

把int  i  =1  /0;注释掉,就可以访问到正常的welcome:

在整个全局异常处理中主要涉及两个注解:@ControllerAdvice和@ExceptionHandler

@ControllerAdvice是个类级别注解,作用于整个spring工程。该注解定义了一个全局异常处理器,表明该controller是个全局异常处理器。

@ExceptionHandler是个方法级别注解,作用于整个controller(可以对比上面的类注解)。其中的value表示会处理某个类型的异常及其子异常。