1. 两种异常处理机制
1.1 使用 throw 关键字手动抛出异常
使用
throw关键字
抛出异常,代码会的显得简单明了
如下图所示
1.2 使用 try-catch 捕获异常
使用
try-catch
进行捕获异常,往往会使代码变得更加笼统,层层包裹
如下图所示
2. 自定义异常处理
我们可以使用我们自定义的异常处理,用于解决我们所设定的异常
import lombok.Data;/*** 自定义异常*/
@Data
public class XueChengPlusException extends RuntimeException{private String errMessage;public XueChengPlusException() {}public XueChengPlusException(String message) {this.errMessage = message;}public static void cast(String message){throw new XueChengPlusException(message);}public static void cast(CommonError error){throw new XueChengPlusException(error.getErrMessage());}
}
3. 异常返回前端信息model
由于我们往往需要前后端联调的时候,寻要获取异常处理的信息,使其显示在前端页面,显示给用户
import java.io.Serializable;/*** 错误响应参数包装,异常信息模型*/public class RestErrorResponse implements Serializable {private final String errMessage;public RestErrorResponse(String errMessage) {this.errMessage = errMessage;}public String getErrMessage() {return errMessage;}
}
4. 通用异常信息
从上文来看,我们自定义异常继承的是RuntimeException,但如果是出现其他类型的异常,例如Exception…,我们需要定义一个通用异常处理
/*** @description 通用错误信息*/
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;}}
5. 全局异常处理
这是一个异常处理机器,用于处理各种异常,然后返回给前端一个异常信息
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {/*** 针对自定义异常进行处理* @param e* @return*/@ExceptionHandler(XueChengPlusException.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublic RestErrorResponse customException(XueChengPlusException e){//记录异常log.error("系统异常{}",e.getErrMessage(),e);//解析出异常信息String errMessage = e.getErrMessage();RestErrorResponse restErrorResponse = new RestErrorResponse(errMessage);return restErrorResponse;}@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublic RestErrorResponse customException(Exception e){//记录异常log.error("系统异常{}",e.getMessage(),e);//解析出异常信息RestErrorResponse restErrorResponse = new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());return restErrorResponse;}
}