异常处理@ExceptionHandler遇到的问题

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

使用@ExceptionHandler处理异常发现了两个问题

1.首先发现配置了@ExceptionHandler 处理业务异常或者原生的Exception异常时候

发现没有效果

代码如下 


@Controller

public class BaseExceptionHandler {
    private static final Logger LOGGER = LoggerFactory.getLogger(BaseExceptionHandler.class);

    /**
     * 处理 Exception类型的异常
     * @param req
     * @param res
     * @param e
     * @throws Exception
     */
    @ExceptionHandler(Exception.class)
    public void resolveException(HttpServletRequest req, HttpServletResponse res, Exception e) throws Exception {
        LOGGER.error(e.getMessage(), e);

        res.setContentType("application/json");
        BaseResponse result = new BaseResponse();
        result.setCodeAndMessage(ResponseCodeEnum.SYS_ERROR.getCode(),
                ResponseCodeEnum.SYS_ERROR.getMessage() + e.getMessage());
        WriterUtil.write(res, result);

    }

controller层代码 

这里应该抛出超时异常 

期待的效果

{
  "code": "999",
  "message": "系统异常null"
}

实际效果

{
  "timestamp": 1532075339890,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "com.fomoney.invoice.core.core.commons.exception.BizException",
  "message": "用户未授权",
  "path": "/testException"
}

没有走我们的统一异常处理

发现是因为上面两处代码一个用的注解是 @Controller 一个是@Restcontroller

统一改成@Restcontroller就可以

2 问题2 如果是捕获原生的异常 

@RequestMapping("/mvc29")
	@ResponseBody
	public WebAsyncTask<AuthorizationResponseEntity> mvc29() {
		Callable<AuthorizationResponseEntity> callable = new Callable<AuthorizationResponseEntity>() {
			@Override
			public AuthorizationResponseEntity call() throws Exception {
				Thread.sleep(6000);
				AuthorizationResponseEntity t = new AuthorizationResponseEntity();
				t.setCodeAndMessage("200", "test");
				return t;
			}
		};
		return new WebAsyncTask<AuthorizationResponseEntity>(4000, callable);
	}

  发现仍然没有效果

实际抛出的效果类似如下

{
  "timestamp": 1532075339890,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "com.fomoney.invoice.core.core.commons.exception.BizException",
  "message": "用户未授权",
  "path": "/testException"
}

@ControllerAdvice 需要 加在

类的前面如下

@RestController
@ControllerAdvice
public class BaseExceptionHandler {
	private static final Logger LOGGER = LoggerFactory.getLogger(BaseExceptionHandler.class);

	/**
	 * 处理 Exception类型的异常
	 * 
	 * @param req
	 * @param res
	 * @param e
	 * @throws Exception
	 */
	@ExceptionHandler(Exception.class)
	public void resolveException(HttpServletRequest req, HttpServletResponse res, Exception e) throws Exception {
		LOGGER.error(e.getMessage(), e);

		res.setContentType("application/json");
		BaseResponse result = new BaseResponse();
		result.setCodeAndMessage(ResponseCodeEnum.SYS_ERROR.getCode(),
				ResponseCodeEnum.SYS_ERROR.getMessage() + e.getMessage());
		WriterUtil.write(res, result);

	}

如上所示 即可 捕获

我们可以在BaseExceptionHandler中专门处理某个异常类 比如超时的

然后统一返回该类型超时的一些策略 ,因为该种超时可能和其他的超时返回值不一样

猜你喜欢

转载自blog.csdn.net/AlbertFly/article/details/81133682
今日推荐