一、为什么要用全局异常处理
当你的程序跑起来,但是sql有错就会终止你的程序,如果在公司这就很麻烦,所以你需要全局异常以方便维护。ava为什么要自定义异常用if else也可以进行判断,同样是控制台打印 为什么还要异常 而且打印异出错的可能性有很多种,有部分是你可以处理的。但很多是超出你预估的。这种异常你无法处理,这时最好的处理方式就是再将异常抛出。 至于打印异常,这只是异常处理的一种方式,有不少人会先打印异常,再将异常抛出。
二、代码实现
先创建捕获异常类
/**
* 统一异常处理
*/
@Slf4j
@RestControllerAdvice
public class UnifiedExceptionHandler {
/**
* 捕获Exception异常
*
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public R handleException(Exception e) {
log.error(e.getMessage(), e);
return R.error();
}
/**
* 捕获BadSqlGrammarException异常
* SQL语法错误
*
* @param e
* @return
*/
@ExceptionHandler(value = BadSqlGrammarException.class)
public R handleException(BadSqlGrammarException e) {
log.error(e.getMessage(), e);
return R.setResult(ResponseEnum.BAD_SQL_GRAMMAR_ERROR);
}
/**
* 捕获BusinessException异常
* 这是自定义的异常,它将处理系统中所有自己抛出的异常,通过状态码和异常信息区分异常类型
*
* @param e
* @return
*/
@ExceptionHandler(value = BusinessException.class)
public R handleException(BusinessException e) {
log.error(e.getMessage(), e);
return R.error().message(e.getMessage()).code(e.getCode());
}
/**
* 捕获Controller上层相关异常
*
* @param e
* @return
*/
@ExceptionHandler({
NoHandlerFoundException.class,
HttpRequestMethodNotSupportedException.class,
HttpMediaTypeNotSupportedException.class,
MissingPathVariableException.class,
MissingServletRequestParameterException.class,
TypeMismatchException.class,
HttpMessageNotReadableException.class,
HttpMessageNotWritableException.class,
MethodArgumentNotValidException.class,
HttpMediaTypeNotAcceptableException.class,
ServletRequestBindingException.class,
ConversionNotSupportedException.class,
MissingServletRequestPartException.class,
AsyncRequestTimeoutException.class
})
public R handleServletException(Exception e) {
log.error(e.getMessage(), e);
return R.error().message(ResponseEnum.SERVLET_ERROR.getMessage()).code(ResponseEnum.SERVLET_ERROR.getCode());
}
}
如上,当出现contorller层或是sql层错误会自动跳到当前异常类。
三、自定义异常类
为什么需要自定义异常类?当你的错误不是上面所包含的比如你想判断用户名字是否为空、而且能自定义返回的响应码。我们平常接触到的都是SUN公司已经写好了的异常类,我们也可以自己定义异常类,方法如下,请看代码。
/**
* 捕获BusinessException异常
* 这是自定义的异常,它将处理系统中所有自己抛出的异常,通过状态码和异常信息区分异常类型
*
* @param e
* @return
*/
@ExceptionHandler(value = BusinessException.class)
public R handleException(BusinessException e) {
log.error(e.getMessage(), e);
return R.error().message(e.getMessage()).code(e.getCode());
}
接下来创建自定义的异常类
package com.wwj.common.result.exception;
import com.wwj.common.result.ResponseEnum;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class BusinessException extends RuntimeException {
/**
* 错误码
*/
private Integer code;
/**
* 错误信息
*/
private String message;
/**
* @param message 错误消息
*/
public BusinessException(String message) {
this.message = message;
}
/**
* @param message 错误消息
* @param code 错误码
*/
public BusinessException(String message, Integer code) {
this.message = message;
this.code = code;
}
/**
* @param message 错误消息
* @param code 错误码
* @param cause 原始异常对象
*/
public BusinessException(String message, Integer code, Throwable cause) {
super(cause);
this.message = message;
this.code = code;
}
/**
* @param resultCodeEnum 接收枚举类型
*/
public BusinessException(ResponseEnum resultCodeEnum) {
this.message = resultCodeEnum.getMessage();
this.code = resultCodeEnum.getCode();
}
/**
* @param resultCodeEnum 接收枚举类型
* @param cause 原始异常对象
*/
public BusinessException(ResponseEnum resultCodeEnum, Throwable cause) {
super(cause);
this.message = resultCodeEnum.getMessage();
this.code = resultCodeEnum.getCode();
}
}