SpringBoot中对于异常处理提供了五种类型的处理方式
自定义错误错误页面 2.@ExceptionHandle注解处理异常 3.@ControllerAdvice&@ExceptionHandler注解处理异常配置SimpleMappingExceptionResolver处理异常自定义HandlerExceptionResolver类处理异常SpringBoot默认的处理异常的机制:
SpringBoot默认已经提供了一套处理异常的机制,一旦程序中出现了异常。SpringBoot会向"/error"的URL发送请求。在SpringBoot中提供了一个"BasicExceptionController"来处理**/error**请求,然后跳转到默认显示异常的页面来展示异常的信息。
如果需要将所有的异常统一跳转到自定义的错误页面,则可以在resources目录下创建一个名为"error"的页面。(名称必须为error)
HTML代码片段 <!DOCTYPE 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>注意:
使用@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接口,并且异常类需要使用**@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代码片段 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>404 page</title> </head> <body> <h2 align="center"> <font class="font-center" th:text="${error}"></font> </h2> </body> </html> 附上一张最终的项目结构图