SpringBoot 工程中项目异常的处理

背景分析
在项目的开发中,无论是对底层的数据逻辑操做过程,仍是业务逻辑的处理过程,仍是控制逻辑的处理
过程,都不可避免会遇到各类可预知的、不可预知的异常。处理好异常对系统有很好的保护做用,同时
会大大提升用户的体验。设计

异常处理分析
Java项目中处理异常方式无非两种,要么执行trycatch操做,要么执行throw操做(抛给其它对象处理),
不管采用哪一种方式,其目的是让咱们的系统对异常要有反馈。但如今的问题是咱们如何让这种反馈代码
的编写即简单又直观、友好。日志

Java项目异常处理规范
咱们在处理异常的过程当中一般要遵循必定的设计规范,例如:code

第一:捕获异常时与抛出的异常必须彻底匹配,或者捕获异常是抛出异常的父类类型。
第二:避免直接抛出RuntimeException,更不容许抛出Exception或者Throwable,应使用有业务含义的自
定义异常(例如ServiceException)。
第三:捕获异常后必须进行处理(例如记录日志)。若是不想处理它,须要将异常抛给它的调用者。
第四:最外层的逻辑必须处理异常,将其转化成用户能够理解的内容。
第五:避免出现重复的代码(Don’t Repeat Yourself),即DAY原则。对象

SpringBoot 工程下的异常处理实践
第一种方式:直接在Controller方法中进行try操做开发

try{
.....
}catch(Exception e){
.....
}

假如controller中每一个方法都要这样作,代码量大而且可重用性太差,难以维护.get

第二种方式:在Controller中定义一个或多个异常处理方法,关键代码以下:io

@ExceptionHandler(RuntimeException.class)
@ResponseBody
public String doHandleException(RuntimeException e){
    log.error("exception {}",e.getMessage());
    return e.getMessage();
}

全部的异常处理方法须要使用@ExceptionHandler进行描述进行描述,并声明它描述的方法能够处理的异常类型,
可是对于此
种方式而言,它只能处理当前Controller中各个方法出现的RuntimeException或者是其子类类型的异常,假如多个Controller类中须要一样方式的异常处理方法,那直接在Controller类中定义异常处理方法并不
是一种很好的选择.class

第三种方式:在控制逻辑层定义全局异常处理类以及异常处理方法,关键代码以下:exception

@Slf4j
//@ResponseBody
//@ControllerAdvice
@RestControllerAdvice
public class GlobalExceptionHandler {
    异常处理方法
   @ExceptionHandler(IllegalArgumentException.class)
   public String doHandleException(IllegalArgumentException e){
   log.error("IllegalArgumentException.exception {}",e.getMessage());
   return e.getMessage();
}

    异常处理方法
   @ExceptionHandler(RuntimeException.class)
   public String doHandleException(RuntimeException e){
   log.error("RuntimeException.exception {}",e.getMessage());
   return e.getMessage();
}

其中,@RestControllerAdvice 注解描述的类为全局异常处理类,当控制层方法中的异常没有本身捕获,
也没有定义其内部的异常处理方法,底层默认会查找全局异常处理类,调用对应的异常处理方法进行异
常处理。方法

相关文章
相关标签/搜索