首页 > 其他分享 >SpringBoot项目中的异常处理

SpringBoot项目中的异常处理

时间:2025-01-22 19:02:48浏览次数:3  
标签:return SpringBoot java 处理 mv ModelAndView 异常 public

定义错误页面

SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息

如 果 我 们 需 要 将 所 有 的 异 常 同 一 跳 转 到 自 定 义 的 错 误 页 面 , 需 要 在src/main/resources/templates 目录下创建 error.html 页面。注意:名称必须叫 error
 

 @ExceptionHandler 处理

针对特定的异常做出不同的处理,我们可以通过@ExceptionHandle来处理实现,具体如下

@Controller
public class UserController {

    /**
     * 模拟 NullPointerException
     * @return
     */
    @RequestMapping("/show1")
    public String showInfo(){
        String str = null;
        str.length();
        return "index";
    }

    /**
     * 模拟 ArithmeticException
     * @return
     */
    @RequestMapping("/show2")
    public String showInfo2(){
        int a = 10/0;
        return "index";
    }
    /**
     * java.lang.ArithmeticException
     * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定
     * 参数 Exception e:会将产生异常对象注入到方法中
     */
    @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;
    }
    /**
     * java.lang.NullPointerException
     * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视
     图的指定
     * 参数 Exception e:会将产生异常对象注入到方法中
     */
    @ExceptionHandler(value={java.lang.NullPointerException.class})
    public ModelAndView nullPointerExceptionHandler(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error", e.toString());
        mv.setViewName("error2");
        return mv;
    }
}

 错误页面

<!DOCTYPE html>
<html lang="en" >
<head>
    <meta charset="UTF-8">
    <title>错误页面</title>
</head>
<body>
出错了,请与管理员联系。。。错误提示页面-ArithmeticException<br>
<span th:text="${error}"></span>
</body>
</html>
<!DOCTYPE html>
<html lang="en" >
<head>
    <meta charset="UTF-8">
    <title>错误页面</title>
</head>
<body>
出错了,请与管理员联系。。。错误提示页面-NullPointerException <br>
<span th:text="${error}"></span>
</body>
</html>

 

 @ControllerAdvice+@ExceptionHandler处理

第二种处理方式中,异常处理的代码和业务代码放在一个类中了,这种方式耦合性太强了,最好是将业务和异常处理的代码分离开,这时我们可以定义一个专门的异常处理类,通过注解@ControllerAdvice来实现。具体如下:

@ControllerAdvice
public class GlobalException {
    /**
     * java.lang.ArithmeticException
     * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定
     * 参数 Exception e:会将产生异常对象注入到方法中
     */
    @ExceptionHandler(value={java.lang.ArithmeticException.class})
    public ModelAndView arithmeticExceptionHandler(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error", e.toString()+" -- advice");
        mv.setViewName("error1");
        return mv;
    }
    /**
     * java.lang.NullPointerException
     * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视
     图的指定
     * 参数 Exception e:会将产生异常对象注入到方法中
     */
    @ExceptionHandler(value={java.lang.NullPointerException.class})
    public ModelAndView nullPointerExceptionHandler(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error", e.toString()+" -- advice");
        mv.setViewName("error2");
        return mv;
    }
}

控制器中实现

@Controller
public class UserController {

    /**
     * 模拟 NullPointerException
     * @return
     */
    @RequestMapping("/show1")
    public String showInfo(){
        String str = null;
        str.length();
        return "index";
    }

    /**
     * 模拟 ArithmeticException
     * @return
     */
    @RequestMapping("/show2")
    public String showInfo2(){
        int a = 10/0;
        return "index";
    }
}

SimpleMappingExceptionResolver处理 

我们还可以通过SimpleMappingExceptionResolver将具体的异常和错误页面指定对应关系,这样就不用每个异常都单独写一个方法了。

@Configuration
public class GlobalException {
    /**
     * 该方法必须要有返回值。返回值类型必须是:
     SimpleMappingExceptionResolver
     */
    @Bean
    public SimpleMappingExceptionResolver
    getSimpleMappingExceptionResolver(){
        SimpleMappingExceptionResolver resolver = new
                SimpleMappingExceptionResolver();
        Properties mappings = new Properties();
        /**
         * 参数一:异常的类型,注意必须是异常类型的全名
         * 参数二:视图名称
         */
        mappings.put("java.lang.ArithmeticException", "error1");
        mappings.put("java.lang.NullPointerException","error2");
        //设置异常与视图映射信息的
        resolver.setExceptionMappings(mappings);
        return resolver;
    }
}

自定义HandlerExceptionResolver处理

最后我们还可以通过实现HandlerExceptionResolver 接口来根据不同异常类型来动态处理异常。

@Configuration
public class GlobalException implements HandlerExceptionResolver {

    /**
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @param e
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest
            , HttpServletResponse httpServletResponse
            , Object o, Exception ex) {
        ModelAndView mv = new ModelAndView();
        //判断不同异常类型,做不同视图跳转
        if (ex instanceof ArithmeticException) {
            mv.setViewName("error1");
        }
        if (ex instanceof NullPointerException) {
            mv.setViewName("error2");
        }
        mv.addObject("error", ex.toString());
        return mv;
    }
}

标签:return,SpringBoot,java,处理,mv,ModelAndView,异常,public
From: https://blog.csdn.net/loushaoqi/article/details/145308986

相关文章

  • 初学SpringBoot
    目录什么是SpringBoot使用SpringBoot有什么好处SpringBoot特点在线构建IntelliJIDEA在线模板构建IntelliJIDEA 通maven项目构建SpringBoot的常用配置入口类和相关注解定制Banner修改banner图标关闭banner常规属性修改tomcat端口号修改常规属性配置类型......
  • SpringBoot整合篇
    目录SpringBoot整合Servlet整合方式一1.1创建servlet1.2启动类中配置1.3启动测试整合方式二2.1创建servlet2.2修改启动类2.3启动程序测试SpringBoot整合Filter整合方式一1.创建过滤器2.创建启动类3.启动测试整合方式二1.创建过滤器2.创建启动类3.启动测......
  • 基于springboot的房屋交易系统设计与实现
    一、系统需求分析用户角色:普通用户:可以浏览房源、发布房源、预约看房、发起交易等。管理员:管理房源信息、用户信息、交易记录等。核心功能:房源信息管理:包括房源的发布、编辑、删除、搜索和展示。用户管理:用户的注册、登录、个人信息管理。预约看房:用户可以预约看房时间。......
  • [日志] 打印异常堆栈信息的技巧
    序Java的异常堆栈信息,对提升排查问题的效率,有极大的帮助————便于我们快速定位异常的发生过程和发生异常的代码行。本文使用的日志框架slf4j:1.7.25log4j(2):2.20.0日志行的打印策略:log4j2.properties#property.log.layout.consolePattern=%d{yyyy/MM/......
  • springboot 社区留守儿童管理系统的设计与实现-毕业设计源码19573
    目 录摘要1绪论1.1系统的选题背景与意义1.2研究内容1.3论文结构与章节安排2 社区留守儿童管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析......
  • Springboot3整合Netty进行消息传递
    1.服务端1.1字符消息NettyServer/***@authorliu.wenxuan1*@Description:netty服务端处理字符消息解码器问题不能同时处理文件和字符*/publicclassNettyServer{privatestaticfinalintPORT=8080;publicstaticvoidmain(String[]args)th......
  • No.11 异常值的识别与处理
    1.什么是异常值偏离观测值较大的值。?mtcarsmydata<-mtcars#删除第8,9列mydata1<-mydata[,-c(8,9)]mydata1运行结果:>#删除第8,9列>mydata1<-mydata[,-c(8,9)]>mydata1mpgcyldisphpdratwtqsecgearcarbMazdaRX4......
  • 基于springboot的高校学生求职就业平台系统(源码+lw+部署文档+讲解等)
    背景及意义基于SpringBoot的高校学生求职就业平台系统,专为助力高校学生顺利求职就业而设计。借助SpringBoot强大的后端开发能力,结合用户体验良好的前端技术,保障系统稳定运行,实现高效的数据交互与精准的业务逻辑处理。学生通过该系统完成注册登录后,能完善个人简历,包......
  • 基于springboot的高校社团管理系统的设计与实现(源码+lw+部署文档+讲解等)
    背景及意义基于SpringBoot的高校社团管理系统,是为高效管理高校各类社团活动与事务而精心打造。凭借SpringBoot强大的后端开发能力,搭配交互友好的前端技术,保证系统稳定运行,实现流畅的数据交互与复杂业务逻辑的精准处理。学生可通过该系统便捷注册登录,浏览社团列表,依......
  • SpringBoot快速整合SqLite
    SpringBoot快速整合SqLite1)SqLite简介SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几......