【Spring Boot】Spring Boot之统一异常处理
2024-10-21 10:28:02
一、统一异常处理的作用
在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;
} }
最新文章
- teamviewer 过期解决办法
- 使用Owin中间件搭建OAuth2.0认证授权服务器
- CMD方式修改MySQL的root用户密码
- IOS微信中看文章跳转页面后点击返回无效
- 第三章 用SDK编译出第一个在Linux下的软件界面
- Xcode快捷键 (本人总结常用的)
- python学习第四天 --字符编码 与格式化及其字符串切片
- C++ classics
- MYSQL 二进制还原
- centos+apache 2.x 开启gzip压缩
- 201521123004 《Java程序设计》第11周学习总结
- 爬虫-request和BeautifulSoup模块
- bootstrap中的dropdown组件扩展hover事件
- 个人实验 github地址:https://github.com/quchengyu/cher
- MySQL事物(一)事务隔离级别和事物并发冲突
- Java如何获取URL连接的日期?
- Java之扫描目录,修改文件内容
- hdoj1074--Doing Homework (DP 状态压缩)
- Restframework 认证authentication 组件实例-1
- Springmvc中的HandlerAdaptor执行流程
热门文章
- 006-nginx.conf详解-error_page 使用
- BigDecimal 基本使用 比较大小和加减乘除
- 在centos7上用docker安装宝塔面板
- git解决error: The following untracked working tree files would be overwritten by checkout
- Laya的List组件+滚动条
- Photoshop 7.0 安装及注册方法
- kubernetes-dashboard获取令牌登陆
- [转帖]java中的for循环
- VMware和Centos安装
- Python知识点总结篇(一)