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

 更新时间:2019年08月28日 14:07:42   作者:韩数  
这篇文章主要介绍了Springboot之自定义全局异常处理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言:

在实际的应用开发中,很多时候往往因为一些不可控的因素导致程序出现一些错误,这个时候就要及时把异常信息反馈给客户端,便于客户端能够及时地进行处理,而针对代码导致的异常,我们一般有两种处理方式,一种是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"}

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

相关文章

  • springboot使用@value注入配置失败的解决

    springboot使用@value注入配置失败的解决

    这篇文章主要介绍了springboot使用@value注入配置失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Intellij IDEA神器居然还有这些小技巧

    Intellij IDEA神器居然还有这些小技巧

    Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜,本文给大家主要介绍一些你可能不知道的但是又实用的小技巧,感兴趣的朋友跟随小编一起看看吧
    2021-01-01
  • Java springboot项目jar发布过程解析

    Java springboot项目jar发布过程解析

    这篇文章主要介绍了Java springboot项目jar发布过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java通过百度API实现图片车牌号识别

    Java通过百度API实现图片车牌号识别

    这段时间做项目需要用java程序进行车牌识别,因此尝试做了下这个程序,本代码功能是通过调用百度API实现的,感兴趣的可以了解一下
    2021-06-06
  • springboot集成JWT实现身份认证(权鉴)的方法步骤

    springboot集成JWT实现身份认证(权鉴)的方法步骤

    本文主要介绍了springboot集成JWT实现身份认证(权鉴)的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Spring实战之缓存使用condition操作示例

    Spring实战之缓存使用condition操作示例

    这篇文章主要介绍了Spring实战之缓存使用condition操作,结合实例形式分析了Spring缓存使用condition具体配置、属性、领域模型等相关操作技巧与注意事项,需要的朋友可以参考下
    2020-01-01
  • Java使用Deque实现堆栈的方法

    Java使用Deque实现堆栈的方法

    这篇文章主要介绍了Java使用Deque实现堆栈的方法,实例分析了java简单实现堆栈的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java OSS批量下载并压缩为ZIP代码实例

    Java OSS批量下载并压缩为ZIP代码实例

    这篇文章主要介绍了Java OSS批量下载并压缩为ZIP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java非静态成员变量之死循环(详解)

    Java非静态成员变量之死循环(详解)

    下面小编就为大家带来一篇Java非静态成员变量之死循环(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • mybatis如何设置useGeneratedKeys=true

    mybatis如何设置useGeneratedKeys=true

    这篇文章主要介绍了mybatis如何设置useGeneratedKeys=true,具有很好的参考价值,希望对大家有所帮助。
    2022-01-01

最新评论