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.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 空指针异常

1.2.1 示例代码

a 访问地址时的代码
 @RequestMapping("err1")
    public String a1(){
        String s=null;
        System.out.println("测试进入了没有???");
        System.out.println(s.indexOf("abc"));
        return "操作成功";
    }
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.2 代码分析

因为配置SpringMVC的时候只扫描了controller包,因此这个异常处理类是需要放在Controller类这个里面的
通过@RestControllerAdvice和@ExceptionHandler给指定的异常配备了处理方法,那么只要在访问过程中出现了该异常,那么就会自动进入该方法

1.2.3 代码运行截图

a 前台运行截图

SpringMVC学习篇(六)_第1张图片

b 控制台运行截图

SpringMVC学习篇(六)_第2张图片

1.3 数组下标越界

1.3.1 示例代码

a 访问地址时的代码
@RequestMapping("err2")
    public String a2(){
        String[] arr={};
        System.out.println(arr[100]);
        return "操作成功";
    }
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.3.2 代码分析

a 需要对什么异常信息进行处理,就可以通过 @ExceptionHandler注解将对应异常类的.class作为参数传入进去
b 因为我们是要进行bug的修复,所以可以通过 ex.printStackTrace()的方式在控制台打印错误信息,方便我们进行后续的调试

1.3.3 代码运行截图

a 前台运行截图

SpringMVC学习篇(六)_第3张图片

b 控制台运行截图

SpringMVC学习篇(六)_第4张图片

1.4 其他异常

1.4.1 示例代码

a 访问地址时的代码
 @RequestMapping("err3")
    public String a3(){
        System.out.println(1/0);
        return "操作成功";
    }
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.4.2 代码分析

配置了Exception类,那么所有出现的异常都能进入该方法,保证呢对所有的错误进行精准的调试

1.4.3 代码运行截图

a 前台运行截图

SpringMVC学习篇(六)_第5张图片

b 控制台运行截图

SpringMVC学习篇(六)_第6张图片

2 xml方式

2.1 准备工作

2.1.1 WEB-INF文件夹下创建空指针处理页面

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>


    Title


    

空指针异常

<%="错误信息:"+exception.getMessage()%>

2.1.2 WEB-INF文件夹下创建数组下标越界异常处理界面

<%@ page contentType="text/html;charset=UTF-8" language="java"  isErrorPage="true" %>


    Title


    

数组下标越界异常

<%="错误信息:"+exception.getMessage()%>

2.1.3 WEB-INF文件夹下创建其他异常处理界面

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>


    Title


   

服务器异常

<%="错误信息:"+exception.getMessage()%>

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>

2.3 空指针异常

2.3.1 示例代码

@RequestMapping("err1")
public String a1(){
    String s=null;
    System.out.println("测试进入了没有???");
    System.out.println(s.indexOf("abc"));
    return "操作成功";
}

2.3.2 代码运行截图

SpringMVC学习篇(六)_第7张图片

2.4 数组下标越界异常

2.4.1 示例代码

  @RequestMapping("err2")
    public String a2(){
        String[] arr={};
        System.out.println(arr[100]);
        return "操作成功";
    }

2.4.2 代码运行截图

SpringMVC学习篇(六)_第8张图片

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

2.5.1 示例代码

 @RequestMapping("err3")
    public String a3(){
        System.out.println(1/0);
        return "操作成功";
    }

2.5.2 代码运行截图

SpringMVC学习篇(六)_第9张图片

3 总结

一般来说,配置全局异常处理的话,采用的是注解方式居多,因为它可以很灵活的去处理出现的异常

你可能感兴趣的:(SpringMVC学习,Spring,MVC,全局异常处理,注解方式,xml方式)