异常篇
自定义异常
没有定义异常时,代码如下:
@PostMapping
public AjaxResult addUser(@Validated @RequestBody SysUser user) {
try {
userService.insertUser(user);
return AjaxResult.success();
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error(e.getMessage());
}
}
此时,如果代码报错,会直接返给用户错误信息,我们无法定义这个错误,用户看不懂且不美观。
自定义一个全局异常:
/**
* 全局异常
* 继承 RuntimeException 类
* 将异常信息message交给父类处理
*/
public class GlobalException extends RuntimeException {
public GlobalException(String message) {
super(message);
}
}
然后在代码中体现自定义异常:
@PostMapping
public AjaxResult addUser(@Validated @RequestBody SysUser user) {
try {
userService.insertUser(user);
return AjaxResult.success();
} catch (GlobalException e) {
e.printStackTrace();
// 这个 e 信息可以由我们定义,然后返回给用户
return AjaxResult.error(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("服务器故障~");
}
}
但是如果有多种校验,或者异常的话,代码就会很臃肿,所以此时就需要定义全局异常!
全局异常
定义一个全局异常类:
/**
* 我们需要在controller执行之后,报错了,再执行这个类的方法去处理异常
*/
//@ControllerAdvice : 这个注解打在类上,这个类就可以在其他controller执行前后去做一些事情(AOP思想)
@RestControllerAdvice
public class GlobalExceptionHandler {
/*
* 异常拦截,如果controller中出现此方法的异常则被此方法拦截
*/
//@ExceptionHandler : 异常拦截注解
@ExceptionHandler(value = GlobalException.class)
public AjaxResult handlerGlobalException(GlobalException e) {
// 打印异常供程序员排查
e.printStackTrace();
// 返给用户的异常信息
return AjaxResult.error("错误异常1");
}
@ExceptionHandler(value = Exception.class)
public AjaxResult handlerException(Exception e) {
e.printStackTrace();
return AjaxResult.error("系统错误~");
}
}
此时,接口中不再需要 try catch:
@PostMapping
public AjaxResult addUser(@Validated @RequestBody SysUser user) {
userService.insertUser(user);
return AjaxResult.success();
}
注意 :全局异常需要能被主启动类扫描到(即主启动类所在的路径必须 在全局异常之上或者平级),如果实在无法扫描到,可以在主启动类上添加注解:
// 强制导入一个类
@Import(GlobalExceptionHandler.class)