使用@ControllerAdvice+@ExceptionHandler处理异常
@ControllerAdvice 可以认为是Controller的增强,@ControllerAdvice通过annotations(), basePackageClasses(), basePackages() 方法定制用于选择控制器子集。一般结合@ExceptionHandler来处理异常
@ExceptionHandler中只有一个参数,即 Class<? extends Throwable>[] value() default {}; 接收一个继承自Throwable接口的异常类的字节码,我们可以向其中根据我们业务的需要传入异常类,当捕获到异常类,则执行标识的方法中对异常的处理。
如果不使用@ControllerAdvice,只用@ExceptionHandler在Controller中处理异常,那样每一个Controller都要有一个@ExceptionHandler
@ExceptionHandler配合@ControllerAdvice使用,则可以统一进行异常处理
下面看一个简单的例子,我们用一个异常处理类来统一处理所有异常
@ControllerAdvice
@Slf4j
public class MallException {
@ExceptionHandler(Exception.class)
@ResponseBody
public String exceptionHandle(Exception e){
log.error(e.getMessage());
return "error";
}
}
在此处我们传入Exception.class代表我们所有异常都经过此处理,且通过@slf4j记录日志,我们可以根据业务需要传入自定义异常,控制异常处理的粒度。
写一个Controller测试一下
@Controller
public class TestController {
@GetMapping("demo1")
public String demo1(){
int a=4/0;
return "demo1";
}
}
当经过此控制器发现错误,则返回结果