SpringBoot异常处理的5种方式
Springboot的五种异常错误处理方式
一 自定义错误页面
只需要在resources/templates/目录下新建一个名为error的视图页面即可,当出现异常时,SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个
叫 BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。
Controller类中
页面中
效果
缺点:拦截所有错误,不灵活
二 使用注解@ExceptionHandler处理
在controller类中添加错误类,返回ModelandView,并使用@ExceptionHandler(value={})注解,value中标注错误类型,当发生错误时会自动跳转到你设置的错误页面中
Controller类
@Controller public class ExceptionController { @RequestMapping("/zidingyi") public String zidingyi(){ int i=100/0; return "index"; } @RequestMapping("/zidingyi1") public String zidingyi1(){ String str=null; str.length(); return "index"; } //定义错误处理,value中指定错误类型 @ExceptionHandler(value={java.lang.ArithmeticException.class}) public ModelAndView exception1(Exception e){ ModelAndView mv=new ModelAndView(); mv.addObject("error",e.toString()); mv.setViewName("error1"); return mv; } //定义错误处理,value中指定错误类型 @ExceptionHandler(value={java.lang.NullPointerException.class}) public ModelAndView exception2(Exception e){ ModelAndView mv=new ModelAndView(); mv.addObject("error",e.toString()); mv.setViewName("error2"); return mv; } }
错误页面
页面一 <!DOCTYPE html> <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>这里是ArithmeticException错误页面</title> </head> <body> 发生错误啦 <span th:text="${error}"></span> </body> </html> 页面二 <!DOCTYPE html> <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>这里是NullPointerException错误页面</title> </head> <body> 发生错误啦 <span th:text="${error}"></span> </body> </html>
缺点:只能在一个controller中使用,不能跨controller使用
三 使用注解@controllerAdvice处理
定义一个类用来装所有的错误类型,并且使用@controllerAdvice注解
Controller类
AllException类
package com.ht.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; /** * Created by wqx on 2019/3/20. */ @ControllerAdvice public class AllException { @ExceptionHandler(value={java.lang.ArithmeticException.class}) public ModelAndView exception1(Exception e){ ModelAndView mv=new ModelAndView(); mv.addObject("error",e.toString()); mv.setViewName("error1"); return mv; } //定义错误处理,value中指定错误类型 @ExceptionHandler(value={java.lang.NullPointerException.class}) public ModelAndView exception2(Exception e){ ModelAndView mv=new ModelAndView(); mv.addObject("error",e.toString()); mv.setViewName("error2"); return mv; } }
缺点:如果有多个错误还是要写多个方法,代码重复严重
四 使用@Configuration注解处理
新建类,在类中使用@Configuration注解,在类中定义方法,方法使用@Bean注解,并且返回值为:SimpleMappingExceptionResolver
AllException2类:
package com.ht.exception; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver; import java.util.Properties; /** * Created by wqx on 2019/3/20. */ //第四种方法:使用@Configuration注解和@Bean注解,将所有的错误都定义到一个方法中,发生错误时, // 会根据判断自动跳转到指定错误页面 @Configuration public class AllException2 { // 该方法必须要有返回值。返回值类型必须是:SimpleMappingExceptionResolver @Bean public SimpleMappingExceptionResolver toexception(){ SimpleMappingExceptionResolver resolver=new SimpleMappingExceptionResolver(); Properties mapping=new Properties(); //参数一:错误类型 参数二:指定跳转的错误页面 mapping.put("java.lang.ArithmeticException","error1"); mapping.put("java.lang.NullPointerException","error1"); resolver.setExceptionMappings(mapping); return resolver; } }
Controller类
package com.ht.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** * Created by wqx on 2019/3/20. */ @Controller public class ExceptionController { @RequestMapping("/zidingyi") public String zidingyi(){ int i=100/0; //第一种方法:自定义错误页面,发生错误时自动跳转,页面名称必须为error,放在templates目录下 return "index"; } @RequestMapping("/zidingyi1") public String zidingyi1(){ String str=null; str.length(); return "index"; }
缺点:不能将错误信息传递到页面中
五 自定义 HandlerExceptionResolver 类处理异常
新建类,使用Configuration注解并且实现HandlerExceptionResolver接口,实现方法
AllException类
package com.ht.exception; import org.springframework.context.annotation.Configuration; import org.springframework.lang.Nullable; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Created by wqx on 2019/3/20. */ //第五种方法:使用Configuration注解并且实现HandlerExceptionResolver接口 @Configuration public class AllException3 implements HandlerExceptionResolver{ @Nullable @Override public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, @Nullable 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.toString()); return mv; } }
Controller类
推荐使用第五种方法,既可以将错误定义到一个方法中,又可以传递错误信息到错误页面中
- Spring Boot 全局异常处理 与 Hibernate Validator校验框架整合
- spring boot的异常处理
- SpringBoot学习-(二十一)SpringBoot异常统一处理
- SpringBoot处理全局统一异常
- SpringBoot进阶之统一异常处理(含源码)
- 微服务,微架构[七]之springboot异常处理
- spring boot 全局异常处理
- SpringBoot框架中REST接口的异常处理方法
- springboot全局异常处理详解
- Springboot自定义异常处理
- springboot mvc 处理异常
- springboot统一异常处理
- Spring Boot学习(六)之Web应用的统一异常处理
- Springboot项目统一异常处理
- Spring Boot学习进阶笔记(五)-异常统一处理
- Spring Boot & Spring MVC 异常处理的 N 种方法
- 系统中异常公共处理模块 in spring boot
- springboot使用注解方式aop,获取注解参数,处理request和response
- Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json
- spring boot之统一错误异常处理