SpringBoot异常处理的方式

SpringBoot异常处理的五种方式



前言

有五种常用的方式 1.自定义错误页面(默认处理异常的方式)
2.@ExceptionHandle 注解处理异常
3.@ControllerAdvice+@ExceptionHandler (全局异常处理器)注解处理异常
4.配置 SimpleMappingExceptionResolver(全局异常处理器) 处理异常
5.自定义 HandlerExceptionResolver 类处理异常

提示:以下是本篇文章正文内容,下面案例可供参考

一、自定义错误页面(默认)?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

1.引入Pom依赖

代码如下(示例):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.usian</groupId>
    <artifactId>springboot_error</artifactId>
    <version>1.0-SNAPSHOT</version>


    <!--
           引入父级依赖 进行项目的自动配置
        -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <dependencies>
        <!--
              web启动器 springmvc的启动器
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--
           log4j的启动器
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
            <version>1.3.8.RELEASE</version>
        </dependency>
        <!--
           Aop的启动器
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!--
            lombok依赖
        -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>

</project>

2.创建controller和html

代码如下(示例):

在这里插入图片描述
在这里插入图片描述


3.自定义错误页面(默认处理异常的方式)

直接在templates文件夹中添加一个error.html 作为报错信息展示界面
注意:必须名称为error
(1) springboot默认处理异常的方式

- 在templates目录下面,创建一个error.html页面。只要后台资源发生了异常(不管是什么异常),都统统的交给error页面来处理

在这里插入图片描述

- 如果我们需要对不同的异常做不同的处理,我们将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下,
发生此状态码的错误就会来到 对应的页面   
我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态 码.html);

在这里插入图片描述

页面能获取的信息;
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里
定义4xx.html或者5xx.html页面。在页面输出一些错误处理信息

<h3>这里报了一个500错误!!!</h3>
<h1>500</h1>
<h3>status:[[${
    
    status}]]</h3>
<h3>timestamp:[[${
    
    timestamp}]]</h3>
<h3>error:[[${
    
    error}]]</h3>
<h3>exception:[[${
    
    exception}]]</h3>
<h3>message:[[${
    
    message}]]</h3>

在这里插入图片描述

4.@ExceptionHandle 注解处理异常

在这里插入图片描述

在这里插入图片描述
注意:吧error文件加和error.html文件名改一下,因为他俩优先级比较高,会覆盖后面写的错误页面

优点:可以自定义异常信息存储的key,自定义跳转视图的名称
缺点:需要编写大量的异常处理方法,不能跨controller,如果两个controller中出现同样的异常,需要重新编写异常处理的方法

5.@ControllerAdvice+@ExceptionHandler (全局异常处理器)注解处理异常

注意:注释之前的处理异常代码 加上注解**@ControllerAdvice+@ExceptionHandler**
步骤
1编写处理错误的页面 error1.html
2编写controller 测试
在这里插入图片描述
在这里插入图片描述
优点:统一管理异常,而不用一个一个页面写了,减少了页面的数量,不用一个个写500,404这些了!而是交给GlobalExceptionHandler 进行统一管理 一定要加注解

缺点:缺点:编写大量的异常处理方法,代码冗余

6.配置 SimpleMappingExceptionResolver(全局异常处理器) 处理异常

步骤:需要将SimpleMappingExceptionResolver注入到spring容器里面     
注意:注释之前代码。。。。。。。。
package com.usian.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import java.util.Properties;

//将GlobalExceptionHandler变成配置类
@Configuration
public class GlobalExceptionHandler {
    
    
    /**
     * 这个方法返回值类型必须是:SimpleMappingExceptionResolver
     */
    @Bean
    public SimpleMappingExceptionResolver getExceptionResolver(){
    
    
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties properties = new Properties();
        /**
         * 参数1:处理的具体的异常的类型
         * 参数2:处理异常需要跳转到的视图
         */
        properties.put("java.lang.NullPointerException","error3");
        properties.put("java.lang.ArithmeticException","error3");
        properties.put("java.lang.ArrayIndexOutOfBoundsException","error3");
        resolver.setExceptionMappings(properties);
        return resolver;
    }

}

缺点:不显示具体异常信息

7.自定义 HandlerExceptionResolver 类处理异常

步骤1:实现HandlerExceptionResolver接口重写resolveException方法
注意:@Component给他加入到spring容器中

package com.usian.config;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyExceptionReslover implements HandlerExceptionResolver {
    
    
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    
    
    //所有异常都封装到Exception  ex对象中去了   
    //此时只要判断异常的类型,做不同视图跳转
        
        return null;
    }
}

第二步:所有异常都封装到Exception ex对象中去了 , 此时只要判断异常的类型,做不同视图跳转判断异常的类型,做不同视图跳转

package com.usian.config;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyExceptionReslover implements HandlerExceptionResolver {
    
    
    /*处理异常的方法*/
    @Override
    public ModelAndView resolveException(HttpServletRequest request
            , HttpServletResponse response,
             Object handler
            , Exception ex) {
    
    

        ModelAndView mv = new ModelAndView();
        // 判断不同异常类型,做不同视图跳转
        if (ex instanceof ArithmeticException) {
    
    
            mv.setViewName("error3");
        }
        if (ex instanceof NullPointerException) {
    
    
            mv.setViewName("error3");
        }
        mv.addObject("error", ex.toString());
        return mv;
    }
}


总结

SpringBoot异常处理的方式
例如:以上就是今天要讲的内容,本文仅仅简单介绍了SpringBoot异常处理的方式,一般都选择全局处理,比较方便。

如有啥不足的地方请指正。。。。。。

猜你喜欢

转载自blog.csdn.net/weixin_46310452/article/details/112627294