当前位置:首页 » 《关注互联网》 » 正文

springboot全局异常处理_SiuMu_的博客

15 人参与  2021年07月14日 13:43  分类 : 《关注互联网》  评论

点击全文阅读


定了个Plan,时间到了只完成了P,因为lan。

序言

  有时候我们写代码是无法预测程序会出现什么异常的,也无法预知用户的神奇操作,因此,有时候我们的程序可能会爆出,500啊,404啊,401啊,403啊等等各种错误,这样错误让用户看到肯定很不好,我们只想给他们看到,类似 “网络错误!请稍后重试”“服务器繁忙,请等会再来”这样的话。
  但是我们又不能每段程序都给你来上一段try-catch所以,就需要一个手段,能让程序发生了异常之后,有一个统一的处理地方。
相关代码放在这里:https://gitee.com/siumu/blog_code.git

正文

  接下来我们就学习一下springboot是怎么进行统一异常处理的。其实非常简单,就是两个注解而已。
  首先我们先创建一个简单的springboot项目并写一个简单的统一异常处理类

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResultJSON handlerException(Exception e){
        System.out.println("全局异常处理!----》》》》"+e.getMessage());
        return new ResultJSON(500,"error");
    }
}

  没错,就是这么简单,我们就完成了一个全局异常处理,不管哪里发生了异常,都会在这里处理。我们先测试一下,先写一个请求接口:

@RestController
@RequestMapping("user")
public class UserController {

    @GetMapping("login")
    public ResultJSON login(){
        int index = 1/0;
        return new ResultJSON(200,"success");
    }

}

  这样,我们就简单完成了一个请求,并手动写了个bug用来触发异常。接下来我们启动项目并请求这个接口。
  我一般不用postman,都是用IDEA自带的restClient工具,在菜单栏里Tools>HTTP Client:
在这里插入图片描述
点击之后会出现如下图这个东西,我们一般一看就知道这东西怎么用:
在这里插入图片描述
  请求我们已经写好了,如果这个接口正常我们会返回{code: 200,msg: success}这样的返回值,但是由于我们主动写了一个bug,它肯定会触发异常,就会走那个全局异常处理的方法。我们发送请求,试试看:
在这里插入图片描述

在这里插入图片描述
  可以看到,我们发送请求,返回了

{
  "code": 500,
  "msg": "error",
  "result": null
}

  并且,控制台打印了全局异常处理的日志。这就是统一异常处理来返回那些无法预知的系统错误。

模拟异常处理

  异常处理,主要还是看自己公司的代码规范,我这里就随便瞎写了一种,模拟一下。
首先我们先定义个枚举来维护所有的异常情况。

public enum CommonException {

    LOGIN_FAIL(102, "用户名或者密码有误!"),
    AUTHORITY_Fail(403, "没有相关权限!!");

    private int code;

    private String msg;

    CommonException(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

然后我们定义一个基础的异常,并将这个枚举作为这个异常类的属性:

@Data
public class BaseException extends RuntimeException {

    //异常的枚举
    private CommonException exceptionContent;

    public BaseException(CommonException exceptionContent) {
        this.exceptionContent = exceptionContent;
    }
}

接下来我们在统一异常处理里,捕获这个异常,并返回枚举里的code和msg


    @ExceptionHandler(BaseException.class)
    public ResultJSON handlerBaseException(BaseException e) {
        System.out.println("全局异常处理!----》》》》" + e.getExceptionContent());
        CommonException content = e.getExceptionContent();
        return new ResultJSON(content.getCode(), content.getMsg());
    }

然后我们写几个请求接口,来触发这些异常。

@RestController
@RequestMapping("user")
public class UserController {

    @GetMapping("login")
    public ResultJSON login(@RequestBody User user) {
        System.out.println(user.getUsername() + "::" + user.getPassword());
        return new ResultJSON(200, "success");
    }

    @PostMapping("loginFail")
    public ResultJSON loginFail(@RequestBody User user) {

        //判断用户是否为空
        if (user == null) {
            throw new BaseException(CommonException.LOGIN_FAIL);
        }else if (!"xiumu".equals(user.getUsername())) {
            throw new BaseException(CommonException.LOGIN_FAIL);
        }

        return new ResultJSON(200, "success");
    }

    @PostMapping("noAuth")
    public ResultJSON noAuth(@RequestBody User user) {

        //判断用户是否为空
        if (user == null) {
            throw new BaseException(CommonException.LOGIN_FAIL);
        } else if (!"xiumu".equals(user.getUsername())) {
            throw new BaseException(CommonException.AUTHORITY_Fail);
        }

        return new ResultJSON(200, "success");
    }

}

可以看到,我们判断一些条件之后,直接抛出我们定义的异常即可。
最后我们写两个请求,运行一下就知道了。
在这里插入图片描述

请求结果如下:
在这里插入图片描述

总结

  异常的内容不仅可以用枚举来定义,也可以将code和msg放在BaseException类中,然后定义多个异常类继承这个BaseException类,在代码中遇到不同的情况就抛出不同的异常。使用方式有很多,只是代码规范不同而已。

相关代码放在这里:https://gitee.com/siumu/blog_code.git


点击全文阅读


本文链接:http://zhangshiyu.com/post/23282.html

异常  请求  枚举  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 家宴过后,我捉奸了庶妹和我老公无广告_庶妹老公侍卫TOP10_小说后续在线阅读_无删减免费完结_
  • 寝室六个人,她们背着我建五人群必读文_太天真申请书冷笑最新阅读_小说后续在线阅读_无删减免费完结_
  • 开局获得狐仙传承结局+番外_江帆赵雪隐藏剧情_小说后续在线阅读_无删减免费完结_
  • 刀锈春根生,白骨犹温完结全文_卫舟棠棠知意一口气完结_小说后续在线阅读_无删减免费完结_
  • 夫君立筷子定我灾星罪名,我改嫁冷宫皇子后他追悔莫及好评_赵荀孟如安青瑶精心编著_小说后续在线阅读_无删减免费完结_
  • 邻居低素质,而我没素质独家番外_老太太赖皮欣欣超长版_小说后续在线阅读_无删减免费完结_
  • 重生后我转嫁首富瘸腿独子,总裁前夫却疯了一口气看完_妹妹傅云琛沈明辉独家番外_小说后续在线阅读_无删减免费完结_
  • 我拒绝给系花捐款后,全系同学悔疯了在线阅读_小说后续在线阅读_无删减免费完结_
  • 我让位给女友的透视眼竹马,他却说如果能重生再也不来了。虐心反转_玉石林若女友推荐_小说后续在线阅读_无删减免费完结_
  • 相国独子的丫鬟砸坏我的玉佩后,我当场拒婚阅读_玉佩陈郡谢氏全新_小说后续在线阅读_无删减免费完结_
  • 手术时,我看着病人惨死最新试读_淼淼陆知衍姜颜全本完结_小说后续在线阅读_无删减免费完结_
  • 男友霸道给我开黑卡,转头却骂我是捞女最新章节_肖年顾客黑卡热文_小说后续在线阅读_无删减免费完结_

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1