springboot全局异常怎么处理
实际开发中,我们代码中异常情况肯定五花八门,在测试的情况下什么都正常,上线了就问题多多。那我们怎么才能对异常能全局去处理,方便记录和查找问题。
异常分类
看了这个图大概明白了我们异常该怎么去处理了吧。我们要拦截的异常就这样。
RestControllerAdvice注解方式
这个注解的使用:在请求到达controller之前的参数错误,请求方式错误,数据格式不一致问题都可以拦截到。
/**
* 全局异常处理类
* @author yangwei
*
* 用于全局返回json,如需返回ModelAndView请使用ControllerAdvice
* 继承了ResponseEntityExceptionHandler,对于一些类似于请求方式异常的异常进行捕获
*/
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
private static Properties properties = ReadPropertiesUtil.getProperties(System.getProperty("user.dir") CommonUrl.RESPONSE_PROP_URL);
/**
* 重写handleExceptionInternal,自定义处理过程
**/
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
//这里将异常直接传给handlerException()方法进行处理,返回值为OK保证友好的返回,而不是出现500错误码。
return new ResponseEntity<>(handlerException(ex), HttpStatus.OK);
}
/**
* 异常捕获
* @param e 捕获的异常
* @return 封装的返回对象
**/
@ExceptionHandler(Exception.class)
public ReturnVO handlerException(Throwable e) {
ReturnVO returnVO = new ReturnVO();
String errorName = e.getClass().getName();
errorName = errorName.substring(errorName.lastIndexOf(".") 1);
//如果没有定义异常,而是直接抛出一个运行时异常,需要进入以下分支
if (e.getClass() == RuntimeException.class) {
returnVO.setMessage(properties.getProperty(valueOf("RuntimeException").msg()) ": " e.getMessage());
returnVO.setCode(properties.getProperty(valueOf("RuntimeException").val()));
} else {
returnVO.setMessage(properties.getProperty(valueOf(errorName).msg()));
returnVO.setCode(properties.getProperty(valueOf(errorName).val()));
}
return returnVO;
}
}
我们只需要在handlerException方法中,实现异常的具体业务逻辑即可。比如我们保存错误信息,发送邮件通知等操作。也可以自定义异常去捕获。
欢迎关注