金刀的博客 | SpringBoot Exception 异常处理入门篇

    xiaoxiao2024-01-12  151

    SpringBoot中异常处理方式

    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>

    @ExceptionHandler

    JAVA后端代码片段 @Controller public class ExceptionHandleController { @RequestMapping(value = "/number") public String numberResult() { System.out.println(10/0); return "index"; } /** * 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; } } 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>

    注意:

    使用@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类处理异常

    在自定义的全局异常处理类中实现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> 附上一张最终的项目结构图
    最新回复(0)