开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情
本文介绍做全局异常的四大步骤,带你写全局异常处理。细节信息在程序中基本都有解释。
step1:写自定义异常并继承RuntimeException,举例:
public class XueChengPlusException extends RuntimeException{
//定义变量接错误消息
private String errMessage;
//基本的构造函数
public XueChengPlusException() {
super();
}
public XueChengPlusException(String message) {
super(message);
this.errMessage = message;
}
public String getErrMessage() {
return errMessage;
}
/**
* 为方便抛异常,定义静态方法
* @param errMessage
*/
public static void cast(String errMessage){
throw new XueChengPlusException(errMessage);
}
}
step2:定义通用错误信息,举例:
public enum CommonError {
UNKOWN_ERROR("执行过程异常,请重试。"),
PARAMS_ERROR("非法参数"),
OBJECT_NULL("对象为空"),
QUERY_NULL("查询结果为空"),
REQUEST_NULL("请求参数为空");
private String errMessage;
public String getErrMessage() {
return errMessage;
}
private CommonError( String errMessage) {
this.errMessage = errMessage;
}
}
step2-1:在自定义异常中加入通用异常的处理,加入下面代码到step1:
/**
* 静态重载方法,抛通用异常
* @param commonError
*/
public static void cast(CommonError commonError){
throw new XueChengPlusException(commonError.getErrMessage());
}
step3:包装错误响应
public class RestErrorResponse implements Serializable {
private String errMessage;
public RestErrorResponse(String errMessage){
this.errMessage= errMessage;
}
public String getErrMessage() {
return errMessage;
}
public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
}
}
step4:全局异常处理,举例:
@Slf4j
@ControllerAdvice //控制器增强
public class GlobalExceptionHandler {
//处理自己的异常XueChengPlusException,此类异常由我们(程序员)主动抛出,可预知的异常
/**
* //@ExceptionHandler是Spring3.0提供的标识在方法上或类上的注解,用来表明方法的处理异常类型。
* @param e
*/
@ResponseBody //将信息返回为json
@ExceptionHandler(XueChengPlusException.class) //此方法就捕获XueChengPlusException异常
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //这个注解告诉方法最后要返回500
public RestErrorResponse doXueChengPlusException(XueChengPlusException e){
//加一个日志来捕获异常信息
log.error("捕获异常: {}",e.getErrMessage());
e.printStackTrace();
String errMessage = e.getErrMessage();
return new RestErrorResponse(errMessage);
}
//捕获不可预知的异常Exception
@ResponseBody //将信息返回为json
@ExceptionHandler(Exception.class) //此方法就捕获XueChengPlusException异常
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //这个注解告诉方法最后要返回500
public RestErrorResponse doException(Exception e){
//加一个日志来捕获异常信息
log.error("捕获异常: {}",e.getMessage());
e.printStackTrace();
// return new RestErrorResponse(e.getMessage());
return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());
}
}
返回的将是json类型的异常信息,数据是由step3规定的。最后是测的错误返回: