- 项目端口:
8080
- 本地地址:
localhost:8080
通常来说,在Spring Boot Web
项目中,有些异常信息是需要返回给调用者的。例如一些业务异常:账号异常、某个具体业务异常等。不同的异常有时候可能需要做不同的处理,一般项目中都会有多个异常。
基本上为了代码可读性和整洁,很少会在Controller中try-catch捕获service抛出的异常。除了在某个Controller的方法中使用@ExceptionHandler
外,更多情况下是使用@ControllerAdvice
配合@ExceptionHandler
进行全局的异常捕获和处理,方便快捷。
PS. 控制好异常的生命周期(抛出及捕获)对于一个攻城狮来说很重要
相信很多人都比较熟悉这个注解,简单说下,一般这个注解用于:
- 全局数据绑定,
@ModelAttribute
- 全局数据预处理
@InitBinder
- 全局异常处理
@ExceptionHandler
通常主要用于全局异常处理,也是本篇主要说的,下面使用@ControllerAdvice
注解的类统称为全局异常处理类
。
全局异常处理类主要分为:
当抛出的异常种类不多的时候,一般使用单个@ControllerAdvice
注解的类并配合@ExceptionHandler
即可.
假设现在分别有:BusinessException
、AccountException
、Exception
这三个异常,只要controller中没有进行try-catch,就进行全局异常处理,为了简单实现,这三个异常都会在Controller中直接抛出。
git checkout single_controller_advice
执行Application.java
访问对应的api:
/account
- 抛出账户异常/business
- 抛出业务异常/exception
- 抛出通用异常(一般很少抛出非RuntimeException的异常,防止傻逼兜底用的)
下面代码中的三个方法,分别对应处理ThrowExceptionsController.java
中抛出的:BusinessException
、AccountException
、Exception
三个异常,异常抛出位置可以在Service也可以在Controller,看具体需要。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity handleBusinessException(BusinessException ex){
...
}
@ExceptionHandler(AccountException.class)
public ResponseEntity handleAccountException(AccountException ex){
...
}
@ExceptionHandler(Exception.class)
public ResponseEntity handleException(Exception ex){
...
}
}