SpringBoot项目如何做到统一异常处理

在项目中,难免会出现各种各样的异常,我们希望异常信息尽可能详细,包括响应状态码,响应的字符串异常信息,甚至操作时间等等,这样可以方便地快速定位到发生异常的位置.所以,一个项目中对于异常的处理就显得尤为重要.那么,小编就以SpringBoot框架,通过代码实例展示统一异常的处理方式.

1.首先我们简单搭建一个SpringBoot框架的项目,项目名称是exceptionhandler(异常处理)

2.导入相关依赖

导入lombok依赖,提供@getter注解

导入日期工具类JodaTime,提供DateTime.now()方法

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--日期工具类:JodaTime-->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

3.编写application.yml配置文件

注意这里添加了访问路径前缀

server:
  port: 8082
  servlet:
    context-path: /exception

4.编写SpringBoot的启动类

package com.exception;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ExceptionApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExceptionApplication.class, args);
    }
}

5.编写异常枚举类

异常枚举类中,应该列举出项目可能出现的所有异常类型,这里只拿数学计算异常举例

package com.exception.enums;

import lombok.Getter;

/**
 * 异常枚举类
 */
@Getter
public enum ExceptionEnum {
    ARTITHMETIC(500, "数学计算异常");
    private Integer status;
    private String message;

    ExceptionEnum(Integer status, String message) {
        this.status = status;
        this.message = message;
    }
}

6.编写自定义异常类

自定义异常类继承RuntimeException,同时RuntimeException继承Exception类,而Exception又继承Throwable类,super方法最终也是Throwable中的方法

package com.exception.exceptions;

import com.exception.enums.ExceptionEnum;
import lombok.Getter;

/**
 * 自定义异常类
 */
@Getter
public class SelfDefinedException extends RuntimeException {
    private Integer status;

    public SelfDefinedException(ExceptionEnum exceptionEnum) {
        super(exceptionEnum.getMessage());
        this.status = exceptionEnum.getStatus();
    }

    public SelfDefinedException(ExceptionEnum exceptionEnum, Throwable cause) {
        super(exceptionEnum.getMessage(), cause);
        this.status = exceptionEnum.getStatus();
    }
}

7.编写统一异常返回结果类

package com.exception.entity;

import com.exception.exceptions.SelfDefinedException;
import lombok.Getter;
import org.joda.time.DateTime;

/**
 * 统一异常返回结果类
 */
@Getter
public class ExceptionResult {
    private Integer status;
    private String message;
    private String timestamp;

    public ExceptionResult(SelfDefinedException e) {
        this.status = e.getStatus();
        this.message = e.getMessage();
        this.timestamp = DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
    }
}

8.编写统一异常拦截类

需注意两个spring注解的作用:

@ControllerAdvice:此注解默认情况下,会拦截所有加了@Controller注解的类

@ExceptionHandler():此注解用在方法上,括号内声明要处理的异常类型,可以指定多个,这里我们指定的是自定义异常

package com.exception.advice;

import com.exception.entity.ExceptionResult;
import com.exception.exceptions.SelfDefinedException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * 统一异常拦截类
 */
@ControllerAdvice
@Slf4j
public class BasicExceptionAdvice {
    @ExceptionHandler(SelfDefinedException.class)
    public ResponseEntity<ExceptionResult> handlerException(SelfDefinedException e) {//参数类型与要处理的异常类型必须匹配
        return ResponseEntity.status(e.getStatus()).body(new ExceptionResult(e));//body中的对象必须和ResponseEntity中的对象一致
    }
}

9.编写测试类

package com.exception.controller;

import com.exception.enums.ExceptionEnum;
import com.exception.exceptions.SelfDefinedException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class TestController {
    @GetMapping("/test")
    public ResponseEntity<String> login() {
        try {
            Integer tempValue = 10 / 0;
        } catch (Exception e) {
            throw new SelfDefinedException(ExceptionEnum.ARTITHMETIC);//catch捕获异常后,这里throw抛出异常并未处理,所以后面的代码不会执行
        }
        return ResponseEntity.ok("没发现异常,返回正确的字符串");
    }
}

10.测试结果

通过IDEA自带的HTTP Client进行测试,观察响应结果如下.这样我们就得到了

总结:

因为项目中会出现各种各样的异常,所以我们通过一个异常枚举类将所有的异常进行列举.我们希望捕获自己定义的异常,所以编写了一个自定义异常类,同时我们希望响应的异常结果规则且详细,所以通过一个统一异常结果类来实现.最重要的是,我们还需要一个异常拦截类,这样在我们抛出自定义异常的时候,这个异常拦截类能够进行拦截,并将我们定义好的响应结果(也就是异常体所有信息)返回.

原文地址:https://www.cnblogs.com/ubiquitousShare/p/12447569.html

时间: 2024-10-16 15:19:11

SpringBoot项目如何做到统一异常处理的相关文章

Java 服务器项目风格推荐 - 统一异常处理

1.介绍 统一的异常处理有两方面的作用,第一是帮助我们将异常保存,以便后续处理,另一方面,同意一场处理是作为响应的一部分,快速的响应给用户处理结果 2.使用 我是用的是 SpringBoot 框架,框架自带了异常处理的方法,我只需要添加自己的异常处理函数就行,同时,配合上一章介绍的统一响应是异常处理更加完善. @ControllerAdvice public class ExceptionControllerAdvice { /** * 捕获参数异常 * * @param e 异常请求 * @p

springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解.请求乱码解决.统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制.登录判断重定向.session时间设置 springboot + shiro 动态更新用户信息 基于前篇,新增功能: 新增shiro权限注解: 请求乱码问题解决: 统一异常处理. 源码已集成到项目中: github源码: https://githu

项目总结(二、统一异常处理)

二.统一异常处理 我们知道项目如果采用分层结构的话,异常需要一层层往上抛,直至到action层,然后在action处理异常,提示友好的异常信息给用户.如果在action的每个方法中都用try{}catch处理,那么类似的代码会很多,且如果需要在异常处理时新增一些逻辑,则需要更改的地方很多,工作量大,不易于维护.于是项目打算采用struts的拦截器机制,实现统一异常处理. 1.struts配置文件 首先自定义拦截器栈,配置如下: <!-- 自定义拦截器栈 --> <interceptors

spring 或 springboot统一异常处理

spring 或 springboot统一异常处理https://blog.csdn.net/xzmeasy/article/details/76150370 一,本文介绍spring MVC的自定义异常处理,即在Controller中抛出自定义的异常时,客户端收到更友好的JSON格式的提示.而不是常见的报错页面. 二,场景描述:实现公用API,验证API key的逻辑,放在拦截器中判断(等同于在Controller中)并抛出异常,用户收到类似下图的提示: 其中,Http状态Code也能自由控制

spring-boot实战【07】【转】:Spring Boot中Web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容. 选择一个之前实现过的Web应用(Chapter3-1-2)为基础,启动该应用,访问一个不存在的URL,或是修改处理内容,直接抛出异常,如: 1 2 3 4 @RequestMapping("/hello") public String hello() throws Exce

011医疗项目-模块一:统一异常处理

010中提到了serivce层抛出异常,然后由Action层去捕获异常去处理,之前的写法是很繁琐的,所以我们这里统一异常处理. Java中进行异常处理: 一类是可预知的异常,程序员在编码时,主动抛出的异常,为了给用户操作提示,提前检查代码中可能存在异常. 通过开发中,采用自定义的异常类,每个异常类表示每一类异常信息.类需要继承Exception类. 本系统采用统一异常类,提供一个属性标识异常类. 另一类是不可预知异常,就是runtimeException异常,通过提高代码编写质量来避免此类异常,

springboot aop + logback + 统一异常处理 打印日志

1.src/resources路径下新建logback.xml 控制台彩色日志打印 info日志和异常日志分不同文件存储 每天自动生成日志 结合myibatis方便日志打印(debug模式) <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 可以在LogBack 的配置中使用相对路径--> &

springboot统一异常处理

快看小说网 我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容.我怎么这么有钱 选择一个之前实现过的Web应用(Chapter3-1-2)为基础,启动该应用,访问一个不存在的URL,或是修改处理内容,直接抛出异常,如:   1 2 3 4   @RequestMapping("/hello") public String he

spring boot 1.5.4 统一异常处理(九)

上一篇:springboot 1.5.4 配置文件详解(八) 1      Spring Boot统一异常处理 Spring Boot中实现了默认的error映射,但是在实际应用中,上面你的错误页面对用户来说并不够友好,我们通常需要去实现我们自己的异常提示. 以springboot项目为例,进行处理! springboot项目源码: https://git.oschina.net/wyait/springboot1.5.4.git 1.1  创建全局异常处理类 通过使用@ControllerAd