项目目录结构:
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表示会处理某个类型的异常及其子异常。