全局异常处理

异常处理

如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
 //添加页面
public CmsPageResult add(CmsPage cmsPage){
//校验页面是否存在,根据页面名称、站点Id、页面webpath查询
CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
if(cmsPage1==null){
cmsPage.setPageId(null);//添加页面主键由spring data 自动生成
cmsPageRepository.save(cmsPage);
//返回结果
CmsPageResult cmsPageResult = new CmsPageResult(CommonCode.SUCCESS,cmsPage);
return cmsPageResult;
}
return new CmsPageResult(CommonCode.FAIL,null);
}

1、上边的代码只要操作不成功仅向用户返回“错误代码:11111,失败信息:操作失败”,无法区别具体的错误信息。

2、service方法在执行过程出现异常在哪捕获?在service中需要都加try/catch,如果在controller也需要添加try/catch,代码冗余严重且不易维护。

解决方案:

1、在Service方法中的编码顺序是先校验判断,有问题则抛出具体的异常信息,最后执行具体的业务操作,返回成功信息。

2、在统一异常处理类中去捕获异常,无需controller捕获异常,向用户返回统一规范的响应信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//添加页面
public CmsPageResult add(CmsPage cmsPage){
//校验cmsPage是否为空
if(cmsPage == null){
//抛出异常,非法请求
//...
}
//根据页面名称查询(页面名称已在mongodb创建了唯一索引)
CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
//校验页面是否存在,已存在则抛出异常
if(cmsPage1 !=null){
//抛出异常,已存在相同的页面名称
//...
}
cmsPage.setPageId(null);//添加页面主键由spring data 自动生成
CmsPage save = cmsPageRepository.save(cmsPage);
//返回结果
CmsPageResult cmsPageResult = new CmsPageResult(CommonCode.SUCCESS,save);
return cmsPageResult;
}

1532595345826.png

1、在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型

2、统一由异常捕获类捕获异常,并进行处理

3、捕获到自定义异常则直接取出错误代码及错误信息,响应给用户。

4、捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,如果有则取出错误代码和错误信息并响应给用户,如果从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。

5、将错误代码及错误信息以Json格式响应给用户。

自定义异常:主要是处理和业务相关的异常

不可预知的异常:主要是处理和业务无关的运行时异常

自定义异常类继承RuntimeException,对代码没有侵入性

统一异常捕获类,在类上加上@ControllerAdvice注解

声明一个方法,加上@ExceptionHandler注解,参数中如果没有写具体的异常,那么默认会拦截所有的异常。如果需要指定拦截的异常,那么需要给出拦截类的class。

springboot日志

日志:开发环境设置level为DEBUG,生产环境设置为ERROR。

springboot中集成了日志记录功能,只需要将日志的配置文件logback-spring.xml(必须是这个文件名)放在resource目录下即可。

在异常类中定义

1
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@ControllerAdvice
public class ExceptionCatch {
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);

//捕获 CustomException异常
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseResult customException(CustomException e) {
LOGGER.error("catch exception : {}\r\nexception: ",e.getMessage(), e);//注意,error中的{}一定要写,否则,无法记录日志。
ResultCode resultCode = e.getResultCode();
ResponseResult responseResult = new ResponseResult(resultCode);
return responseResult;
}
}

普通的springMVC全局异常(项目有且只有一个全局异常类)

  1. 编写全局异常类GlobalExceptionResolver并实现HandlerExceptionResolver,并重写resolveException方法.

  2. 在springmvc的配置文件中引入bean

1
<bean class="com.han.springmvc.exception.GlobalExceptionResolver"/>
0%