SpringMVC学习篇(六)

SpringMVC之全局异常的处理

1 注解方式

1.1 准备工作

1.1.1 导入springmvc依赖和lombok依赖
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.22</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </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 前台运行截图

在这里插入图片描述

b 控制台运行截图

在这里插入图片描述

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 前台运行截图

在这里插入图片描述

b 控制台运行截图

在这里插入图片描述

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 前台运行截图

在这里插入图片描述

b 控制台运行截图

在这里插入图片描述

2 xml方式

2.1 准备工作

2.1.1 WEB-INF文件夹下创建空指针处理页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>空指针异常</h1>
    <%="错误信息:"+exception.getMessage()%>
</body>
</html>
2.1.2 WEB-INF文件夹下创建数组下标越界异常处理界面
<%@ page contentType="text/html;charset=UTF-8" language="java"  isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>数组下标越界异常</h1>
    <%="错误信息:"+exception.getMessage()%>
</body>
</html>
2.1.3 WEB-INF文件夹下创建其他异常处理界面
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <h3>服务器异常</h3>
   <%="错误信息:"+exception.getMessage()%>
</body>
</html>

2.2 配置springMVC主配置文件

<!--异常处理 SimpleMappingExceptionResolver-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!--默认错误页面-->
    <property name="defaultErrorView" value="WEB-INF/err"></property>
    <!--自定义不同的异常页面 prop标签里面可以指定不同的错误所对应的错误页面
    把错误页面设置在WEB-INF文件夹下面,是不想用户能够在正常的情况下访问到该页面
    -->
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.NullPointerException">WEB-INF/kzz</prop>
            <prop key="java.lang.ArrayIndexOutOfBoundsException">WEB-INF/szyj</prop>
        </props>
    </property>
    <!--拦截器配置
    mvc:mapping 要拦截的地址 必须以/开头
    exclude-mapping 不拦截的地址
    -->
</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 代码运行截图

在这里插入图片描述

2.4 数组下标越界异常

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

在这里插入图片描述

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

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

在这里插入图片描述

3 总结

一般来说,配置全局异常处理的话,采用的是注解方式居多,因为它可以很灵活的去处理出现的异常
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值