当前位置: 代码网 > it编程>编程语言>Java > springboot捕获全局异常实现过程

springboot捕获全局异常实现过程

2026年03月13日 Java 我要评论
学习目标java中的异常和错误学习内容首页要了解什么是异常什么是错误捕捉全局异常自定义异常java中异常和错误的区别error类和exception类的父类都是throwable类: 他们的区别是:e

学习目标

java中的异常和错误

学习内容

  • 首页要了解什么是异常什么是错误
  • 捕捉全局异常
  • 自定义异常

java中异常和错误的区别

error类和exception类的父类都是throwable类: 他们的区别是:

  • error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
  • exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

常见的异常 :

  • arrayindexoutofboundsexception 数组下标越界异常,
  • arithmaticexception 算数异常 如除数为零
  • nullpointerexception 空指针异常
  • illegalargumentexception 不合法参数异常

直接上代码

public class exception {
    public static void main(string[] args) {
        exception01();
    }
    public static void exception01(){
        int i =1/0;
    }
}

结果是:算数异常,如果直接让用户看见异常信息不友好

改造一下写法:把异常捕获,这样就不会看见异常信息,这里写的有些问题 不应该写execption,这个异常都所有异常的父类,应该写对应的异常,算数异常是 arithmeticexecption

真正的项目里发生异常该怎么捕获呢?下面就来了解一下全局异常,创建springboot项目

1.创建一个controller包,里面写了一个异常方法,

2.配置swagger-ui来进行接口的访问

 @getmapping("exception")
 public r exception(){
   throw new runtimeexception("运行异常");
}

结果肯定是报错,但是这个异常是可以人工干预的,避免控制台输出报错信息,或者把报错解释的详细一点

创建一个myexceptionhandler类,这个类就是来帮我们捕获全局异常的类,

1.在这个类上加上@restcontrolleradvice注解

2.创建一个方法

3.在方法上加上@exceptionhandler注解中可以添加参数,参数是某个异常类的class,代表这个方法 专门处理该类异常,比如这样:,

@restcontrolleradvice
@slf4j
public class myexceptionhandler {
    @exceptionhandler(value = exception.class)
    public string exceptionhandler(exception e){
        log.error("未知异常!原因是:"+e.getmessage());
        return "未知错误!!!";
    }
 }

继续访问异常的接口,没有报错了,返回的结果也我定义的数据

控制台也输出异常信息

到这异常的捕获就完成了,但是我们捕获都是系统自带的异常,我就在想能不能自定义异常,然后进行捕获,开干

实现步骤:

  1. 创建一个枚举进行异常传递
  2. 创建一个自定义的异常类取名叫customexception,
  3. 在myexceptionhandler全局异常中把自定义异常捕获

枚举

@getter
@allargsconstructor
public enum rcode {

    success(0,"操作成功!"),
    fail(1,"操作失败!"),
    auth_error(40411,"用户名或密码不存在!"),
    no_auth_error(40412,"无权访问!"),
    sys_valid_error(501,"参数校验错误"),
    sys_exception(2,"模拟异常"),
    invalid_token(40410,"token无效,您无权访问该接口"),
;

    private integer code;
    private string msg;

}

customexception类

@getter
public class customexception extends runtimeexception{
    private rcode rcode;

    public customexception(rcode rcode) {
        this.rcode = rcode;
    }

    public customexception(throwable cause, rcode rcode) {
        super(cause);
        this.rcode = rcode;
    }
}

在全局异常类中捕获

@restcontrolleradvice
@slf4j
public class myexceptionhandler {
    //捕获自定义异常
    @exceptionhandler(value = customexception.class)
    public r customerexceptionhandler(customexception e){
         log.error("未知异常!原因是:"+e.getrcode().getmsg());
        return r.error(e.getrcode());
    }
 }

进行测试:首页修改controller中接口抛出的异常 换成我们自己定义的异常类

进行测试:结果

控制台:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com