SpringBoot如何优雅地处理全局异常详解

 更新时间:2019年08月11日 09:31:55   作者:Coder小明  
这篇文章主要给大家介绍了关于SpringBoot如何优雅地处理全局异常的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Controller下面,满屏幕的try{}catch,看着一点都不优雅,一点都不符合小明的气质,憋了这么久,小明今天终于决定对所有异常实施统一处理的方案。

开发准备

JDK8、正常的springboot项目

代码编写

通用异常处理

其实Spring系列的项目全局异常处理方式早已存在,只不过我们一直忙于搬砖,很少停下脚步去审视这个日夜与我们相伴的朋友。为了贴合主题,本次主要针对SpringBoot全局异常处理进行举例说明。

SpringBoot中有一个@ControllerAdvice的注解,使用该注解即表示开启全局异常捕获,接下来我们只需在自定义的方法上使用@ExceptionHandler注解,并定义捕获异常的类型,对这种类型的异常进行统一的处理。

举个例子:

假如我们需要针对NullException(空指针异常,是Java程序员最痛恨的异常,没有之一)进行全局处理(如下所示)。

@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
   * 处理空指针的异常
   * @param req
   * @param e
   * @return
   */
  @ExceptionHandler(value =NullPointerException.class)
  public BaseResponseFacade exceptionHandler(HttpServletRequest req, NullPointerException e){
    log.error("发生空指针异常!原因是:",e);
    return ResponseUtil.error(ResponseCode.ERROR);
  }
}

讷,就这么简单。其他可能发生的异常,都可以以这种方式处理快速处理。此处大家应该表现的十分兴奋,但请不要高兴太早,因为接下来,有更令激动人心的事情。

自定义异常处理

自定义一个异常

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @Description 自定义异常
 * @Date 2019-08-05 15:49
 * @Created by 程序员小明
 */
@Data
@AllArgsConstructor
@Accessors(chain = true)
public class BizException extends RuntimeException {
  /**
   * 错误码
   */
  protected Integer errorCode;
  /**
   * 错误信息
   */
  protected String errorMsg;
}

显而易见,这个异常继承了RuntimeException,属于运行时异常。细心的朋友已经发现,我使用了Lombok插件,非常契合今天的主题,给大家简单介绍一下:

lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁(如果使用的IDE是idea,需要安装插件哈)。

定义过之后,我们就可以和之前处理NullException方式一样处理我们自定义的异常。包括处理其他异常,都是这种方式。直接贴代码。

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

  /**
   * 处理自定义的业务异常
   * @param req
   * @param e
   * @return
   */
  @ExceptionHandler(value = BizException.class)
  public BaseResponseFacade bizExceptionHandler(HttpServletRequest req, BizException e){
    log.error("发生业务异常!原因是:{}",e.getErrorMsg());
    return ResponseUtil.error(e.getErrorCode(),e.getErrorMsg());
  }

  /**
   * 处理空指针的异常
   * @param req
   * @param e
   * @return
   */
  @ExceptionHandler(value =NullPointerException.class)
  public BaseResponseFacade exceptionHandler(HttpServletRequest req, NullPointerException e){
    log.error("发生空指针异常!原因是:",e);
    return ResponseUtil.error(ResponseCode.ERROR);
  }


  /**
   * 处理其他异常
   * @param req
   * @param e
   * @return
   */
  @ExceptionHandler(value =Exception.class)
  public BaseResponseFacade exceptionHandler(HttpServletRequest req, Exception e){
    log.error("未知异常!原因是:",e);
    return ResponseUtil.error(ResponseCode.INTERNAL_SERVER_ERROR);
  }
}

整个全局异常处理方式核心就是以上介绍这些。下面用一个Demo给大家举个例子

@GetMapping("/test")
public BaseResponseFacade test(){
 if(true){
  throw new BizException(1,"error");
 }
 return ResponseUtil.success();
}

地址栏请求,进入这个方法后,会抛出异常,此时全局异常生效,就会返回异常处理过后的信息

{"errorCode":1,"errorMsg":"error","data":null}

到此整个流程都然跑通了。当然,好多地方都可以根据我们自身实际业务情况以此为基础进一步丰富,比如返回数据可以改成跳转某一个具体的页面。这样的出场方式是不是都很优雅?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • 用C和JAVA分别创建链表的实例

    用C和JAVA分别创建链表的实例

    使用用C和JAVA分别创建链表的方法,创建链表、往链表中插入数据、删除数据等操作。
    2013-10-10
  • Java判断当前日期是周几的方法汇总

    Java判断当前日期是周几的方法汇总

    在Java编程中,我们经常会遇到需要获取当前日期是周几的需求。根据国际惯例,一周通常是从周一开始,到周日结束,记作1至7,本文将介绍几种常用的Java方法,让你能够准确地判断当前日期是周几,感兴趣的朋友一起看看吧
    2024-03-03
  • IDEA插件开发注册菜单之向主菜单注册菜单项目

    IDEA插件开发注册菜单之向主菜单注册菜单项目

    这篇文章主要介绍了IDEA插件开发注册菜单之向主菜单注册菜单项目,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Java数组队列及环形数组队列超详细讲解

    Java数组队列及环形数组队列超详细讲解

    队列是一个有序列表,可以用数组和链表来实现,队列有一个原则。即:先存入队列的数据要先取出,后存入的要后取出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • 计算Java数组长度函数的方法以及代码分析

    计算Java数组长度函数的方法以及代码分析

    在本篇内容里,小编给大家整理了关于计算Java数组长度函数的方法以及代码分析内容,有兴趣的朋友么可以学习参考下。
    2022-11-11
  • SpringBoot+logback默认日志的配置和使用方式

    SpringBoot+logback默认日志的配置和使用方式

    这篇文章主要介绍了SpringBoot+logback默认日志的配置和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java二叉树查询原理深入分析讲解

    Java二叉树查询原理深入分析讲解

    这篇文章主要介绍了Java二叉树查询原理,二叉查找树,又称二叉排序树,亦称二叉搜索树,是数据结构中的一类。在一般情况下,查找效率比链表结构要高
    2022-11-11
  • mybatis中foreach报错:_frch_item_0 not found的解决方法

    mybatis中foreach报错:_frch_item_0 not found的解决方法

    这篇文章主要给大家介绍了mybatis中foreach报错:_frch_item_0 not found的解决方法,文章通过示例代码介绍了详细的解决方法,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • MybatisPlus实现逻辑删除的示例代码

    MybatisPlus实现逻辑删除的示例代码

    本文主要介绍了Mybatis Plus实现逻辑删除的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • java使用dom4j生成与解析xml文档的方法示例

    java使用dom4j生成与解析xml文档的方法示例

    这篇文章主要介绍了java使用dom4j生成与解析xml文档的方法,结合实例形式分析了java基于dom4j操作xml节点生成xml文档以及解析xml文档的相关操作技巧,需要的朋友可以参考下
    2017-07-07

最新评论