欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Springboot之自定义全局异常处理的实现

程序员文章站 2023-11-21 17:30:40
前言: 在实际的应用开发中,很多时候往往因为一些不可控的因素导致程序出现一些错误,这个时候就要及时把异常信息反馈给客户端,便于客户端能够及时地进行处理,而针对代码导致...

前言:

在实际的应用开发中,很多时候往往因为一些不可控的因素导致程序出现一些错误,这个时候就要及时把异常信息反馈给客户端,便于客户端能够及时地进行处理,而针对代码导致的异常,我们一般有两种处理方式,一种是throws直接抛出,一种是使用try..catch捕获,一般的话,如果逻辑的异常,需要知道异常信息,我们往往选择将异常抛出,如果只是要保证程序在出错的情况下 依然可以继续运行,则使用try..catch来捕获。

但是try..catch会导致代码量的增加,让后期我们的代码变得臃肿且难以维护。当然,springboot作为一个如此优秀的框架,肯定不会坐视不管的,通过springboot自带的注解,我们可以方便的自定义我们的全局异常处理器,并且以json格式返回给我们的客户端。

代码实战:

捕获全局异常:

首先呢,我们新建我们负责全局异常捕捉处理的类:mycontrolleradvice,代码如下:

@controlleradvice
public class mycontrolleradvice {


  @responsebody
  @exceptionhandler(value = exception.class)
  public map<string,object> exceptionhandler(exception ex){
    map<string,object> map = new hashmap<string,object>();
    map.put("code",100);
    map.put("msg",ex.getmessage());
    //这里可以加上我们其他的异常处理代码,比如日志记录,,,
    return map;
  }

}

注解说明:
@controlleradvice 通过aop的方式配合@exceptionhandler()注解捕获在controller层面发生的异常。如果需要扫描自定路径下的controller,添加basepackages属性

@controlleradvice(basepackages ="com.example.demo.controller")

@restcontrolleradvice : 和@controlleradvice作用相同,可以理解为  @responsebody+@controlleradvice 的组合使用。

@exceptionhandler():该注解作用主要在于声明一个或多个类型的异常,当符合条件的controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息。

测试:

@restcontroller
public class usercontroller {


  @getmapping("/test")
  public string test(){
    int num = 1/0;
    return "hello world";
  }
}

结果:

{"msg":"/ by zero","code":100}

捕获自定义异常:

自定义我们的异常信息类myexception 并继承runtimeexception:

public class myexception extends runtimeexception {

  private string errorcode;
  private string errormsg;

  public myexception(string errorcode, string errormsg) {
    this.errorcode = errorcode;
    this.errormsg = errormsg;
  }


  public string geterrorcode() {
    return errorcode;
  }

  public void seterrorcode(string errorcode) {
    this.errorcode = errorcode;
  }

  public string geterrormsg() {
    return errormsg;
  }

  public void seterrormsg(string errormsg) {
    this.errormsg = errormsg;
  }
  
}

修改我们的mycontrolleradvice,将myexception添加进去:

  @responsebody
  @exceptionhandler(value = myexception.class)
  public map<string,object> myexceptionhandler(myexception mex){
    map<string,object> map = new hashmap<string,object>();
    map.put("code",mex.geterrorcode());
    map.put("msg",mex.geterrormsg());
    //其他业务代码...
    return map;
  }

测试:

  @getmapping("/test1")
  public string test1(){
    string name = null;
    if(name == null){
      throw new myexception("101","用户名为空");
    }
    return "hello world";
  }

输出:

{"msg":"用户名为空","code":"101"}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。