• SpringMVC学习篇(六)


    SpringMVC之全局异常的处理

    1 注解方式

    1.1 准备工作

    1.1.1 导入springmvc依赖和lombok依赖
    <dependencies>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>5.3.22version>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.18.24version>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1.1.2 创建一个自定义消息通知工具类
    package com.util;
    import lombok.Data;
    //自定义响应类型
    @Data
    public class Results {
        /*状态码信息数据*/
        private int code;//状态码
        private String msg;//信息
        private Object data;//数据
    
        public Results(int code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
        public Results(int code, String msg, Object data) {
            this.code = code;
            this.msg = msg;
            this.data = data;
        }
        public static Results ok(){
            return new Results(200, "success");
        }
        /*自定义消息*/
        public static Results ok(String msg){
            return new Results(200, msg);
        }
        public static Results ok(String msg,Object data){
            return new Results(200, msg,data);
        }
        /*自己命名的状态码*/
        public static Results err(String msg){
            return new Results(500,msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    1.2 空指针异常

    1.2.1 示例代码
    a 访问地址时的代码
     @RequestMapping("err1")
        public String a1(){
            String s=null;
            System.out.println("测试进入了没有???");
            System.out.println(s.indexOf("abc"));
            return "操作成功";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    b 异常处理时的代码
    package com.controller;
    import com.util.Results;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    @RestControllerAdvice
    public class MyExceptionHandler {
        @ExceptionHandler(NullPointerException.class)
        public Results ex1(NullPointerException ex){
            //只要出现空指针异常就进入这里
            ex.printStackTrace();//控制台打印异常 便于观察和调试
            return  Results.err("空指针异常");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1.2.2 代码分析
    因为配置SpringMVC的时候只扫描了controller包,因此这个异常处理类是需要放在Controller类这个里面的
    通过@RestControllerAdvice和@ExceptionHandler给指定的异常配备了处理方法,那么只要在访问过程中出现了该异常,那么就会自动进入该方法
    
    • 1
    • 2
    1.2.3 代码运行截图
    a 前台运行截图

    在这里插入图片描述

    b 控制台运行截图

    在这里插入图片描述

    1.3 数组下标越界

    1.3.1 示例代码
    a 访问地址时的代码
    @RequestMapping("err2")
        public String a2(){
            String[] arr={};
            System.out.println(arr[100]);
            return "操作成功";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    b 异常处理时的代码
    package com.controller;
    import com.util.Results;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    @RestControllerAdvice
    public class MyExceptionHandler {
       @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
        public Results ex2(ArrayIndexOutOfBoundsException ex){
            //只要出现数组下标越界异常就进入这里
            ex.printStackTrace();//控制台打印异常 便于观察和调试
            return  Results.err("请求的下标越界 越界信息"+ex.getMessage());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1.3.2 代码分析
    a 需要对什么异常信息进行处理,就可以通过 @ExceptionHandler注解将对应异常类的.class作为参数传入进去
    b 因为我们是要进行bug的修复,所以可以通过 ex.printStackTrace()的方式在控制台打印错误信息,方便我们进行后续的调试
    
    • 1
    • 2
    1.3.3 代码运行截图
    a 前台运行截图

    在这里插入图片描述

    b 控制台运行截图

    在这里插入图片描述

    1.4 其他异常

    1.4.1 示例代码
    a 访问地址时的代码
     @RequestMapping("err3")
        public String a3(){
            System.out.println(1/0);
            return "操作成功";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    b 异常处理时的代码
    package com.controller;
    import com.util.Results;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    @RestControllerAdvice
    public class MyExceptionHandler {
       @ExceptionHandler(Exception.class)
        public Results ex2(Exception ex){
            //只要出现任何异常就进入这里
            ex.printStackTrace();//控制台打印异常 便于观察和调试
            return  Results.err("服务器报错 信息"+ex.getMessage());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1.4.2 代码分析
    配置了Exception类,那么所有出现的异常都能进入该方法,保证呢对所有的错误进行精准的调试
    
    • 1
    1.4.3 代码运行截图
    a 前台运行截图

    在这里插入图片描述

    b 控制台运行截图

    在这里插入图片描述

    2 xml方式

    2.1 准备工作

    2.1.1 WEB-INF文件夹下创建空指针处理页面
    <%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
    
    
        Title
    
    
        

    空指针异常

    <%="错误信息:"+exception.getMessage()%>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2.1.2 WEB-INF文件夹下创建数组下标越界异常处理界面
    <%@ page contentType="text/html;charset=UTF-8" language="java"  isErrorPage="true" %>
    
    
        Title
    
    
        

    数组下标越界异常

    <%="错误信息:"+exception.getMessage()%>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2.1.3 WEB-INF文件夹下创建其他异常处理界面
    <%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
    
    
        Title
    
    
       

    服务器异常

    <%="错误信息:"+exception.getMessage()%>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.2 配置springMVC主配置文件

    
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        
        <property name="defaultErrorView" value="WEB-INF/err">property>
        
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.NullPointerException">WEB-INF/kzzprop>
                <prop key="java.lang.ArrayIndexOutOfBoundsException">WEB-INF/szyjprop>
            props>
        property>
        
    bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.3 空指针异常

    2.3.1 示例代码
    @RequestMapping("err1")
    public String a1(){
        String s=null;
        System.out.println("测试进入了没有???");
        System.out.println(s.indexOf("abc"));
        return "操作成功";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    2.3.2 代码运行截图

    在这里插入图片描述

    2.4 数组下标越界异常

    2.4.1 示例代码
      @RequestMapping("err2")
        public String a2(){
            String[] arr={};
            System.out.println(arr[100]);
            return "操作成功";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2.4.2 代码运行截图

    在这里插入图片描述

    2.5 除上述两种异常之外的异常

    2.5.1 示例代码
     @RequestMapping("err3")
        public String a3(){
            System.out.println(1/0);
            return "操作成功";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2.5.2 代码运行截图

    在这里插入图片描述

    3 总结

    一般来说,配置全局异常处理的话,采用的是注解方式居多,因为它可以很灵活的去处理出现的异常
    
    • 1
  • 相关阅读:
    Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别
    你真的了解IP地址吗?
    使用rustc_interface进行类型检查
    Automated Feature Engineering In AutoML
    react中redux怎么使用
    国产开源数据库建模工具
    Aeraki Mesh 正式成为CNCF沙箱项目,腾讯云携手合作伙伴加速服务网格成熟商用
    黑盒测试与白盒测试
    plain framework的实际应用和扩展
    A-Level商务例题解析及练习Income Statement
  • 原文地址:https://blog.csdn.net/SSS4362/article/details/127877549