- 模拟异常
不做全局统一异常时,当项目中出现异常,会报500.
如:
@PostMapping(value="/testerror")
@ApiOperation(value = "获取用户信息")
public Result.Base testerror(HttpServletRequest request){
Integer inte = 1/0;
return new Result.Success<>(inte);
}
访问接口时报500错误:
2.处理异常
利用@ControllerAdvice和@ExceptionHandler定义一个统一异常处理类
- @ControllerAdvice:控制器增强,使@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的 @RequestMapping注解的方法。
- @ExceptionHandler:异常处理器,此注解的作用是当出现其定义的异常时进行处理的方法
因此只需要添加如下类即可:
如果是自定义异常,可单独再配。
package com.wps.education.exception;
import com.wps.education.LoginInterceptor.LoginInterceptor;
import com.wps.education.common.response.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result.Base jsonErrorHandler(HttpServletRequest req, Exception e) throws Exception {
logger.error("{} | {}", req.getRequestURL().toString(), e.getMessage());
e.printStackTrace();
return new Result.ErrorData<>(e.getMessage());
}
}
接口返回:
后台输出:
3.项目级处理方式
上面的例子可以全局处理异常,并返回错误内容。
但在项目中使用时,不能给用户显示500,也不能显示这些错误内容。而是定义一套错误码,后台统一返回格式,前端处理接口中的错误码,给出相应的业务处理,或更合理的提示信息。
- 定义errorcode类:
import org.apache.http.HttpStatus;
/**
* 定义错误类
*/
public abstract class ErrorCode {
/**
3.1 code:0表示成功, -1表示未知错误
3.1 系统集合(1-99):
3.4 业务相关code集合 (100-399):
*/
/** 成功 */
public static final Integer SUCCESS = 0;
/** 未知 */
public static final Integer UNKNOWN = -1;
/** 未知错误 */
public static final Result.Error ERROR_UNKNOWN = new Result.Error(UNKNOWN, "unknown error", HttpStatus.SC_INTERNAL_SERVER_ERROR);
/** system error code, 1-99 */
/** 参数错误,不正确的参数 */
public static final Result.Error ARGUMENT_INVALID = new Result.Error(1, "parameter is invalid", HttpStatus.SC_BAD_REQUEST);
/** 没有Token */
public static final Result.Error NO_TOKEN_ERROR = new Result.Error(2, "no token error", HttpStatus.