共计 1637 个字符,预计需要花费 5 分钟才能阅读完成。
背景剖析
在我的项目的开发中,不论是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是管制逻辑的解决
过程,都不可避免会遇到各种可预知的、不可预知的异样。解决好异样对系统有很好的爱护作用,同时
会大大提高用户的体验。
异样解决剖析
Java 我的项目中解决异样形式无非两种,要么执行 trycatch 操作,要么执行 throw 操作(抛给其它对象解决),
无论采纳哪种形式,其目标是让咱们的系统对异样要有反馈。但当初的问题是咱们如何让这种反馈代码
的编写即简略又直观、敌对。
Java 我的项目异样解决标准
咱们在解决异样的过程中通常要遵循肯定的设计规范,例如:
第一: 捕捉异样时与抛出的异样必须齐全匹配,或者捕捉异样是抛出异样的父类类型。
第二: 防止间接抛出 RuntimeException, 更不容许抛出 Exception 或者 Throwable, 应应用有业务含意的自
定义异样(例如 ServiceException)。
第三: 捕捉异样后必须进行解决(例如记录日志)。如果不想解决它,须要将异样抛给它的调用者。
第四: 最外层的逻辑必须解决异样,将其转化成用户能够了解的内容。
第五: 避免出现反复的代码(Don’t Repeat Yourself), 即 DAY 准则。
SpringBoot 工程下的异样解决实际
第一种形式: 间接在 Controller 办法中进行 try 操作
try{.....}catch(Exception e){.....}
如果 controller 中每个办法都要这样做, 代码量大并且可重用性太差, 难以保护.
第二种形式: 在 Controller 中定义一个或多个异样解决办法, 要害代码如下:
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public String doHandleException(RuntimeException e){log.error("exception {}",e.getMessage());
return e.getMessage();}
所有的异样解决办法须要应用 @ExceptionHandler 进行形容进行形容, 并申明它形容的办法能够解决的异样类型,
然而对于此
种形式而言, 它只能解决以后 Controller 中各个办法呈现的 RuntimeException 或者是其子类类型的异样, 如果多个 Controller 类中须要同样形式的异样解决办法, 那间接在 Controller 类中定义异样解决办法并不
是一种很好的抉择.
第三种形式: 在管制逻辑层定义全局异样解决类以及异样解决办法, 要害代码如下:
@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 注解形容的类为全局异样解决类,当管制层办法中的异样没有本人捕捉,
也没有定义其外部的异样解决办法,底层默认会查找全局异样解决类,调用对应的异样解决办法进行异
常解决。