Spring Boot教程八:捕获全局异常

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wang_shuyu/article/details/79162613

为了统一api的返回格式,方便前端接受返回数据,全局异常处理是个比较重要的功能,一般在项目里都会用到。

Springboot中的异常捕获通常分为三个阶段。

一:在进入Controller之前,如果请求一个不存在的地址,404错误等 

/**
 * @ClassName: FinalExceptionHandler
 * @Description: 在进入Controller之前,譬如请求一个不存在的地址,404错误。
 * @author shuyu.wang
 * @date 2018年1月25日 下午3:03:11
 * @version V1.0
 */
@RestController
public class FinalExceptionHandler implements ErrorController {

	@Override
	public String getErrorPath() {
		return "/error";
	}

	@RequestMapping(value = "/error")
	@ResponseBody
	public ApiResult error(HttpServletResponse resp, HttpServletRequest req) {
		// 错误处理逻辑
		return new ApiResult(ResultCode.NO_URL.getCode(),ResultMessage.NO_URL.getMessage());
	}

}
其中ApiResult是我自己定义的实体类,可以根据自己需要设置自己的返回类型。


二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。 

/**
 * @ClassName: GlobalExceptionHandler 
 * @Description: 在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误
 * @author shuyu.wang
 * @date 2018年1月25日 下午3:12:16 
 * @version V1.0
 */
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler{
	
	 /**
     * 在controller里面内容执行之前,校验一些参数不匹配啊,Get post方法不对啊之类的
     */
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return new ResponseEntity<Object>(new ApiResult(ResultCode.METHOD_NOT_ALLOWED.getCode(),ResultMessage.METHOD_NOT_ALLOWED.getMessage()), status);

    }

}

其中ApiResult是我自己定义的实体类,可以根据自己需要设置自己的返回对象类型。

三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。 

/**
 * @ClassName: GlobalDefaultExceptionHandler
 * @Description: 在controller里执行逻辑代码时出的异常
 * @author shuyu.wang
 * @date 2017年11月23日 上午9:45:16
 * @version V1.0
 */
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
	private Logger logger = Logger.getLogger(GlobalDefaultExceptionHandler.class);
	/**
	 * @Title: defaultErrorHandler 
	 * @Description: 统一处理某一类异常,从而能够减少代码重复率和复杂度
	 * @param req 
	 * @param e 
	 * @return ApiResult 
	 * @throws
	 */
//	@ExceptionHandler(value = ExceptionResult.class)//指定具体要处理的异常
	@ExceptionHandler//处理所有异常
	@ResponseBody
	public ApiResult defaultErrorHandler(HttpServletRequest req, RuntimeException  ex) {
		// 打印异常信息:
		ex.printStackTrace();
		logger.error("捕获全局异常=="+ex);
		return new ApiResult(ResultCode.SERVER_ERROR.getCode(),ResultMessage.SERVER_ERROR.getMessage(),ex.toString(),null);

	} 

	/**
	 * 捕获类内所有的异常
	 * 
	 * @param ex
	 * @return
	 */
//	@ExceptionHandler(value = Exception.class)
//	public ModelAndView exceptionHandelByThymeleaf(Exception ex, HttpServletRequest req) {
//		ModelAndView mav = new ModelAndView();
//		mav.setViewName("error");
//		mav.addObject("exception", ex.getMessage());
//		mav.addObject("url", req.getRequestURL());
//		return mav;
//	}

}

其中ExceptionResult是我自己定义的异常类,可以直接使用基类Exception。


统一返回类型如下(根据你设置的ApiResult类不同而不同):

{
    "code": 500,
    "message": "服务器异常!",
    "data": "java.lang.ArithmeticException: / by zero",
    "total": null
}



猜你喜欢

转载自blog.csdn.net/wang_shuyu/article/details/79162613