SpringBoot优雅的全局异常处理
代码编写
SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot中有一个ControllerAdvice
的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler
注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。
我们根据下面的这个示例来看该注解是如何使用吧。
示例代码:
import com.nuorui.common.domain.api.R; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 全局异常处理类 * * @author: Fred * @email 453086@qq.com * @create: 2021-07-16 11:07 */ @RestControllerAdvice public class ExceptionsHandler { /** * 业务异常 * * @param ex * @return */ @ExceptionHandler(BizException.class) public R bizExceptionHandler(BizException ex) { return R.failed(ex.msg); } /** * 参数转换异常拦截 * @param ex * @return */ @ExceptionHandler(HttpMessageNotReadableException.class) public R exceptionHandler(HttpMessageNotReadableException ex) { return R.failed("参数格式异常!"); } }
自定义异常类
然后我们在来自定义一个异常类,用于处理我们发生的业务异常。
示例代码:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.Setter; import lombok.experimental.Accessors; /** * 业务异常处理类 * * @author: Fred * @email 453086@qq.com * @create: 2021-07-16 11:07 */ @Data @AllArgsConstructor @Accessors(chain = true) public class BizException extends RuntimeException { @Setter protected int code; @Setter protected String msg; public BizException(String msg){ this.msg = msg; } }