首页 > 其他分享 >SpringBoot全局异常处理,返回数据附带http状态码,以及捕获404页面异常

SpringBoot全局异常处理,返回数据附带http状态码,以及捕获404页面异常

时间:2023-07-10 21:55:04浏览次数:50  
标签:status http SpringBoot data msg 异常 public String

SpringBoot全局异常处理,返回数据附带http状态码,以及捕获404页面异常

前言

全局异常处理对于编写网络接口程序来说至关重要,能省掉很多的判断语句,让逻辑更加清晰。springboot中的全局异常处理并不难。与网上大部分文章不同的是,我用springboot自带的ResponseEntity给返回结果加上了了http状态码。当然有些人的接口可能全部返回200状态也是可以,但是为了以后的兼容性,还是加上状态码比较好。

代码部分

1.定义一个枚举类

枚举类的作用:预先定义好一些常用的状态信息,便于集中状态信息的集中管理

当然这个类也可以不加,但是当编写大项目的时候会变得乱七八糟。

package com.test.exception;

public enum ExceptionEnum{
    //下面是一些预先定义的状态信息
    SUCCESS(200, true, "成功!"),
    SIGNATURE_NOT_MATCH(403,false,"服务器拒绝!"),
    NOT_FOUND(404, false,"未找到该资源!"),
    URL_NOT_FOUND(404, false,"URL不存在!"),
    INTERNAL_SERVER_ERROR(500, false,"服务器内部错误!");

    private final Integer resultCode;
    private final Boolean resultStatus;
    private final String resultMsg;
    //构造函数
    ExceptionEnum(Integer resultCode, Boolean resultStatus, String resultMsg) {
        this.resultCode = resultCode;
        this.resultStatus = resultStatus;
        this.resultMsg = resultMsg;
    }
    
    public Integer getResultCode() { return resultCode;  }
    public Boolean getResultStatus() { return resultStatus; }
    public String getResultMsg() { return resultMsg; }
}

2.统一信息返回格式

统一返回信息json格式为:

{
    "status":true,
    "data":{...},
    "msg":"获取成功"
}

统一信息返回类代码:

主要为了统一返回格式,这样前后端的开发才能更好的结合,代码编写更规范,更易于理解。

package com.test.exception;
import lombok.Data;

@Data
public class R {
    private Boolean status;
    private Object data;
    private String msg;

    public R() {
    }

    //完全自定义的返回,适用于没遇到过的情况
    public R(Boolean status, Object data, String msg) {
        this.status = status;
        this.data = data;
        this.msg = msg;
    }

    //status为true时,用于正常返回,即200状态
    public R(Object data, String msg) {
        this.status = true;
        this.data = data;
        this.msg = msg;
    }
    //status为false时,用于异常类的返回格式
    public R(String msg) {
        this.status = false;
        this.data = null;	//如果失败,data可以直接不反悔
        this.msg = msg;
    }
    //普通的已存在枚举类中的异常
    public R(ExceptionEnum exceptionEnum) {
        throw new MyExceptionHandler(exceptionEnum);
    }
}

3.自定义异常类

继承RuntimeException才能通过抛出这个类来触发异常处理。

这个类很重要,没有这个类不行,因为最终抛出去的就是这个类。

package com.test.exception;

public class MyExceptionHandler extends RuntimeException{
    private Integer code ;	//http状态码
    private Boolean status;
    private String msg ;
    //此构造函数用于枚举中已有的异常
    public MyExceptionHandler(ExceptionEnum exceptionEnum){
        super();
        this.code = exceptionEnum.getResultCode();
        this.status = exceptionEnum.getResultStatus();
        this.msg = exceptionEnum.getResultMsg();
    }
    //完全自定义
    public MyExceptionHandler(Integer code, Boolean status, String msg){
        super(msg);
        this.code = code;
        this.status = status;
        this.msg = msg;
    }
    //用于其他服务器拒绝的情况,比如具体的参数错误,参数格式错误等,这个可能用的比较多,所以单独一个,可自行扩展
    public MyExceptionHandler(Boolean status, String msg){
        super(msg);
        this.code = 403;
        this.status = status;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public Boolean getStatus() {
        return status;
    }

    public String getMsg() {
        return msg;
    }
}

4.全局异常处理函数

这个类也很重要,主要是捕获全局异常,并返回相应的数据。

package com.test.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestControllerAdvice
public class GlobalExceptionHandler {
    //处理普通系统异常
    @ExceptionHandler(value = Exception.class)
    public R systemException(Exception e){
        e.printStackTrace();
     	System.out.println("=======================>>"+e.getMessage()+"=============================");
        return new R(false,null,"系统内部异常,请联系管理员");
    }
    
    
    
    //处理自定义异常
    @ExceptionHandler(value = MyExceptionHandler.class)
    public ResponseEntity<R> myException(MyExceptionHandler e){
        e.printStackTrace();
        ResponseEntity<R> responseEntity;
        switch (e.getCode()){
            case 403:
                responseEntity =  ResponseEntity.status(HttpStatus.FORBIDDEN).body(new R(e.getMsg()));
                break;
            case 404:
                responseEntity =  ResponseEntity.status(HttpStatus.NOT_FOUND).body(new R(e.getMsg()));
                break;
            default:
                responseEntity =  ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new R(e.getMsg()));
                break;
        }

        return responseEntity;

    }
}

5.(补充)404页面不存在异常捕获

在进行全局异常处理的时候,如果访问的url不存在,并不会被全局异常处理捕获到,所以还需要一个类来专门处理页面不存在即url错误的异常信息。

package com.test.exception;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UrlNotFoundException implements ErrorController {
    @RequestMapping("/error")
    public R handle404Error() {
        // 处理自定义的url错误 404 错误逻辑
        return new R(ExceptionEnum.URL_NOT_FOUND);
    }
}

结语

当然,我这个异常处理的代码中还有不少值得优化的地方,但是整体的流程大体就是这么个流程,不会有太大的变化。

标签:status,http,SpringBoot,data,msg,异常,public,String
From: https://www.cnblogs.com/ydteng/p/17542454.html

相关文章

  • springcloud -sentinel 用户自定义限流错误处理(仅限限流异常,其他异常请使用fallback属
    pom依赖<!--SpringCloudailibabanacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>......
  • 每日汇报 第三周第二天 JAVA中的异常处理
    今日所学:掌握什么是异常;区分运行时异常和非运行时异常;掌握try、catch、finally后面代码块发挥的作用;掌握运用try-catch-finally捕获异常;掌握如何运用throws关键字在方法上抛出异常;掌握使用throw关键字为异常创建对象,进而主动印发某种异常明日计划:JAVA中的枚举与泛型......
  • 异常
    一、什么是异常(Exception)实际工作中,遇到的情况不可能是非常完美的。比如你写的某个模块,用户输入不一定符合你的要求,你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能就满了。等等。软件程......
  • ionic cordova 打包Rlease版本包出现异常Execution failed for task ':app:mergeRelea
    异常: 解决方法:找到android=》app下的build.gradle文件,如下增加如下配置 运行ioniccordovabuildandroid--release打包语句正常执行 ......
  • springboot配置文件
    1.配置文件1.1外部加载顺序命令行参数java-jarspring-boot-02-config-02.0.0.1-SNAPSHOT.jar--server.port=8087java-jarspring-boot-02-config-02.0.0.1-SNAPSHOT.jar--spring.profiles.active=prod来自java:comp/env的NDI属性Java系统属性(System.getPro......
  • 1.HTTP面试题
    1.HTTP基本概念1.1HTTP是什么 HTTP(HyperTextTransferProtocol)是超文本传输协议。它是一种双向传输协议。具体来说HTTP是一种在计算机世界里,专门在[两点]之间[传输]文字、图片、音频、视频等[超文本]数据的[约定和规范]。1.2HTTP常见状态码有哪些1XX类状态码属于提示信息,是......
  • 2023-07-10 记录使用chrome浏览器点击内容搜索时跳转到了一个叫www.ibaixia.com的网站
    前言:猜测是chrome中毒了,或者就是网页被劫持了,每次搜索会跳转到www.ibaixia.com,然后在一瞬间又跳转到了百度搜索页。解决方案:在chrome打开chrome://settings/searchEngines,也就是打开设置,找到【网站搜索】一栏,在该栏中找到百度字样,然后打开它,如果是正确的www.baidu.com,那就不用......
  • SpringBoot集成JApiDocs实现自动生成接口文档
    一、概念JApiDocs是一个符合Java编程习惯的Api文档生成工具。最大程度地利用Java的语法特性,你只管用心设计好接口,添加必要的注释,JApiDocs会帮你导出一份漂亮的Html文档,并生成相关的Java和Object-C相关数据模型代码,从此,Android和IOS的同学可以少敲很多代码了,你也不......
  • SpringBoot+Mybatis搭建之采坑记录(持续更新...)
    Stoppingservice[Tomcat] 1.缺少Serivce注解无法启动tomcat 2.包名错误3.写了注解没写参数使用Eclipse调试Springboot项目时总是直接进入SilentExitExceptionHandler解决方案:Window-->Preference-->java-->debug-->Suspendexecutiononuncaughtexceptions选项前面的勾......
  • Eclipse搭建springBoot进阶篇-SpringBoot+Mybatis
    Eclipse搭建springBoot入门篇 在入门篇了搭建了一个简单的SpringBoot的Demo,在进阶篇将真正引入实战,也就是能支撑基本的企业中小型项目开发。本次通过springBoot+Mybatis+maven等搭建一个适用于开发中小型项目的简单架构pom文件需要更新maven的jar,对java包进行下载。<?xmlversi......