SpringBoot 异常处理的多种方式:
方式1:自定义错误界面
SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。 一旦程序中出现了异常 SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个 叫 BasicExceptionController 来处理/error 请求,然后
如果我们需要将所有的异常同一跳转到自定义的错误页面,需要再 src/main/resources/templates 目录下创建 error.html 页面。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"> <title>错误提示页面</title> </head>
<body>
出错了
<span>我是自定义错误界面</span>
</body>
</html>
方式2:@ExceptionHandle 注解处理异常
@Controller
public class Demo01Controller {
@RequestMapping("/demo01")
public String showInfo1(){
String str = null;
//会 出错 报空指针异常
str.length();
return "index";
}
@RequestMapping("/demo02")
public String showInfo2(){
int a = 10 / 0 ;
return "index";
}
/**
* java.lang.ArithmeticException
* 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视
* 图的指定
* @param e 参数 Exception e:会将产生异常对象注入到方法中
* @return
*/
@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;
}
/**
* 处理 NullPointException 的处理
* @param e
* @return
*/
@ExceptionHandler(value = {NullPointerException.class})
public ModelAndView nullpointException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());
mv.setViewName("error2");
return mv;
}
页面信息:
error1.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>异常-ArithmeticException界面</title>
</head>
<body>
出错了 ArithmeticException
<span th:text="${error}"> </span>
</body>
</html>
error2.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>异常-NullPointerException 界面</title>
</head>
<body>
出错了 NullPointerException
<span th:text="${error}"> </span>
</body>
</html>
方式3:@ControllerAdvice+@ExceptionHandler 注解处理异常
/**
* 全局 异常处理类 加注解 @ControllerAdvice
*/
@org.springframework.web.bind.annotation.ControllerAdvice
public class Global01Exception {
/**
* 处理异常的方式
* @param e
* @return
*/
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView arithmeticExceptionHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.setViewName("error1");
return mv;
}
}
方式4:配置 SimpleMappingExceptionResolver 处理异常
/**
* @desc 通过 SimpleMappingExceptionResolver 做全局异常处理
*/
@Configuration
public class Global02Exception {
/**
* 方法的返回值 类型必须是 SimpleMappingExceptionResolver
* @return
*/
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
/**
* 参数1 异常的类型 要是全类名
* 参数2 视图名称
*/
mappings.put("java.lang.NullPointerException", "error1");
mappings.put("java.lang.ArithmeticException", "error2");
//设置异常与视图映射信息的
resolver.setExceptionMappings(mappings);
return resolver;
}
}
方式5:自定义 HandlerExceptionResolver 类处理异常
/**
* @desc 通过实现 HandlerExceptionResolver 接口做全局异常处理
*/
@Configuration
public class Global03Exception implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, 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.getMessage());
return mv;
}
}
例子中使用了 thymeleaf模板 配置如下
# 模板加载
spring.thymeleaf.cache=true
spring.thymeleaf.encoding=utf-8
spring.thymeleaf.mode=HTML
spring.thymeleaf.suffix=.html
spring.thymeleaf.prefix=classpath:/templates/