FrameWork:SpringBoot项目中异常处理

SpringBoot工程中项目异常的处理

背景分析

在项目的开发中国,不管是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是控制逻辑的处理过程,都不可避免会遇到各种可预知的、不可预知的异常。处理好异常对系统有很好的保护作用,同时会大大提高用户的体验。

异常处理分析

Java项目中处理异常方式无非两种,要么执行try-catch操作,要么执行throw操作,无论采用哪种方式,其目的是让我们的系统对异常要有反馈。但现在的问题是我们如何让这种反馈代码的编写既简单又直观、友好。

Java项目异常处理规范

我们在处理异常的过程中通常要遵循一定的设计规范,例如:

第一:捕获异常时与抛出的异常必须完全匹配,或者捕获异常是抛出异常的父类类型。

第二:避免直接抛出RuntimeException,更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常。

第三:捕获异常后必须进行处理(例如记录日志)。如果不象处理它,需要将异常抛给它的调用者。

第四:最外层的逻辑必须处理异常,将其转化成用户可以理解的内容。

第五:避免出现重复的代码(Don’t Repeat Yourself),即DAY原则。

SpringBoot工程下的异常处理实践

第一种方式

直接在Controller方法中进行try操作

假如Controller中每个方法都要这样做,代码量大并且可重用性太差,难以维护。

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

第二种方式

在Controller中定义一个或多个异常处理方法

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

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

第三种方式

在控制逻辑层定义全局异常处理类以及异常处理方法

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

@Slf4j
//@ResponseBody
//@ControllerAdvice //此注解描述的类为全局异常处理类,在此类中可以定义多个异常处理方法
@RestControllerAdvice //@ControllerAdvice+@ResponseBody
public class GlobalExceptionHandler {
异常处理方法
@ExceptionHandler(IllegalArgumentException.class)
//@ResponseBody
public String doHandleException(IllegalArgumentException e){
log.error("IllegalArgumentException.exception {}",e.getMessage());
return e.getMessage();
}
//异常处理方法
@ExceptionHandler(RuntimeException.class)
//@ResponseBody
public String doHandleException(RuntimeException e){
log.error("RuntimeException.exception {}",e.getMessage());
return e.getMessage();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值