使用@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 mvc29() {
Callable callable = new Callable() {
@Override
public AuthorizationResponseEntity call() throws Exception {
Thread.sleep(6000);
AuthorizationResponseEntity t = new AuthorizationResponseEntity();
t.setCodeAndMessage("200", "test");
return t;
}
};
return new WebAsyncTask(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中专门处理某个异常类 比如超时的
然后统一返回该类型超时的一些策略 ,因为该种超时可能和其他的超时返回值不一样