一、统一异常处理的作用

  在web应用中,请求处理时,出现异常是非常常见的。所以当应用出现各类异常时,进行异常的统一捕获或者二次处理(比如空指针异常或sql异常正常是不能外抛)是非常必要的,然后右统一异常处理方法统一返给前端。

对于非自定义的异常,在统一异常处理方法中,会转化为约定了响应的参数格式,如code(非0代表异常)、message,调用方根据错误码进行自己的业务逻辑。

二、统一异常处理方案一
@RestControllerAdvice和@ExceptionHandler的方式

@RestControllerAdvice
public class BaseControllerAdvice {
private static final Logger logger = LoggerFactory.getLogger(BaseControllerAdvice.class);
public static final Pattern ERROR_MESSAGE_PATTERN = Pattern.compile("\\[(\\d{4})\\] (.*)"); public BaseControllerAdvice() {
} @ExceptionHandler
public ApiResponse globalExceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception ex) { logger.error("检测到未捕捉异常:IP:{} invoke url:{} Exception:{}", new Object[]{request.getRemoteAddr(), request.getRequestURL(), ex.getClass().toGenericString(), ex});
     //ApiResponse为自定义异常类 
ApiResponse apiResponse = new ApiResponse(ApiResponseCodeEnum.SYSTEM_EXCEPTION);
if (ex instanceof ApiException) {
Integer code = ((ApiException)ex).getCode();
return new ApiResponse(code, ex.getMessage());
} else {
if (StringUtils.isNotBlank(ex.getMessage())) {
Matcher matcher = ERROR_MESSAGE_PATTERN.matcher(ex.getMessage());
if (matcher.matches()) {
logger.error(ex.getMessage(), ex);
return apiResponse;
}
} return apiResponse;
} }
}

三、统一异常处理方案二

HandlerExceptionResolver的方式

@Component
public class GlobalHandlerExceptionResolver implements HandlerExceptionResolver { private static final Logger logger = LoggerFactory.getLogger(BaseControllerAdvice.class);
public static final Pattern ERROR_MESSAGE_PATTERN = Pattern.compile("\\[(\\d{4})\\] (.*)"); @Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView modelAndView = new ModelAndView();
logger.error("检测到未捕捉异常:IP:{} invoke url:{} Exception:{}", new Object[]{request.getRemoteAddr(), request.getRequestURL(), ex.getClass().toGenericString(), ex});
ApiResponse apiResponse = new ApiResponse(ApiResponseCodeEnum.SYSTEM_EXCEPTION);
if (ex instanceof ApiException) {
Integer code = ((ApiException)ex).getCode();
apiResponse =new ApiResponse(code, ex.getMessage());
} else {
if (StringUtils.isNotBlank(ex.getMessage())) {
Matcher matcher = ERROR_MESSAGE_PATTERN.matcher(ex.getMessage());
if (matcher.matches()) {
logger.error(ex.getMessage(), ex);
}
}
} modelAndView.setView(new MappingJackson2JsonView());
modelAndView.addObject("code",apiResponse.getCode());
modelAndView.addObject("message",apiResponse.getMessage());
return modelAndView;
} }

最新文章

  1. teamviewer 过期解决办法
  2. 使用Owin中间件搭建OAuth2.0认证授权服务器
  3. CMD方式修改MySQL的root用户密码
  4. IOS微信中看文章跳转页面后点击返回无效
  5. 第三章 用SDK编译出第一个在Linux下的软件界面
  6. Xcode快捷键 (本人总结常用的)
  7. python学习第四天 --字符编码 与格式化及其字符串切片
  8. C++ classics
  9. MYSQL 二进制还原
  10. centos+apache 2.x 开启gzip压缩
  11. 201521123004 《Java程序设计》第11周学习总结
  12. 爬虫-request和BeautifulSoup模块
  13. bootstrap中的dropdown组件扩展hover事件
  14. 个人实验 github地址:https://github.com/quchengyu/cher
  15. MySQL事物(一)事务隔离级别和事物并发冲突
  16. Java如何获取URL连接的日期?
  17. Java之扫描目录,修改文件内容
  18. hdoj1074--Doing Homework (DP 状态压缩)
  19. Restframework 认证authentication 组件实例-1
  20. Springmvc中的HandlerAdaptor执行流程

热门文章

  1. 006-nginx.conf详解-error_page 使用
  2. BigDecimal 基本使用 比较大小和加减乘除
  3. 在centos7上用docker安装宝塔面板
  4. git解决error: The following untracked working tree files would be overwritten by checkout
  5. Laya的List组件+滚动条
  6. Photoshop 7.0 安装及注册方法
  7. kubernetes-dashboard获取令牌登陆
  8. [转帖]java中的for循环
  9. VMware和Centos安装
  10. Python知识点总结篇(一)