创意网站建设排行榜,wordpress插件如何汉化,网站上的美工图片要怎么做,上海网站建设企业异常处理
4.6.1 异常问题分析
在service方法中有很多的参数合法性校验#xff0c;当参数不合法则抛出异常#xff0c;下边我们测试下异常处理。
请求创建课程基本信息#xff0c;故意将必填项设置为空。
测试发现报500异常#xff0c;如下#xff1a;
http://localho…异常处理
4.6.1 异常问题分析
在service方法中有很多的参数合法性校验当参数不合法则抛出异常下边我们测试下异常处理。
请求创建课程基本信息故意将必填项设置为空。
测试发现报500异常如下
http://localhost:63040/content/courseHTTP/1.1 500
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 07 Sep 2022 11:40:29 GMT
Connection: close{timestamp: 2022-09-07T11:40:29.67700:00,status: 500,error: Internal Server Error,message: ,path: /content/course
}问题并没有输出我们抛出异常时指定的异常信息。
所以现在我们的需求是当正常操作时按接口要求返回数据当非正常流程时要获取异常信息进行记录并提示给用户。
异常处理除了输出在日志中还需要提示给用户前端和后端需要作一些约定
1、错误提示信息统一以json格式返回给前端。
2、以HTTP状态码决定当前是否出错非200为操作异常。
如何规范异常信息
代码中统一抛出项目的自定义异常类型这样可以统一去捕获这一类或几类的异常。
规范了异常类型就可以去获取异常信息。
如果捕获了非项目自定义的异常类型统一向用户提示“执行过程异常请重试”的错误信息。
如何捕获异常
代码统一用try/catch方式去捕获代码比较臃肿可以通过SpringMVC提供的控制器增强类统一由一个类去完成异常的捕获。
如下图 4.6.2 统一异常处理实现
根据上边分析的方案统一在base基础工程实现统一异常处理各模块依赖了base基础工程都 可以使用。
首先在base基础工程添加需要依赖的包
dependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactId
/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-log4j2/artifactId
/dependency1、定义一些通用的异常信息
package com.xuecheng.base.execption;/*** description 通用错误信息* author Mr.M* date 2022/9/6 11:29* version 1.0*/
public enum CommonError {UNKOWN_ERROR(执行过程异常请重试。),PARAMS_ERROR(非法参数),OBJECT_NULL(对象为空),QUERY_NULL(查询结果为空),REQUEST_NULL(请求参数为空);private String errMessage;public String getErrMessage() {return errMessage;}private CommonError( String errMessage) {this.errMessage errMessage;}}2、自定义异常类型
package com.xuecheng.base.execption;/*** description 学成在线项目异常类* author Mr.M* date 2022/9/6 11:29* version 1.0*/
public class XueChengPlusException extends RuntimeException {private static final long serialVersionUID 5565760508056698922L;private String errMessage;public XueChengPlusException() {super();}public XueChengPlusException(String errMessage) {super(errMessage);this.errMessage errMessage;}public String getErrMessage() {return errMessage;}public static void cast(CommonError commonError){throw new XueChengPlusException(commonError.getErrMessage());}public static void cast(String errMessage){throw new XueChengPlusException(errMessage);}}3、响应用户的统一类型
package com.xuecheng.base.execption;import java.io.Serializable;/*** 错误响应参数包装*/
public class RestErrorResponse implements Serializable {private String errMessage;public RestErrorResponse(String errMessage){this.errMessage errMessage;}public String getErrMessage() {return errMessage;}public void setErrMessage(String errMessage) {this.errMessage errMessage;}
}4、全局异常处理器
从 Spring 3.0 - Spring 3.2 版本之间对 Spring 架构和 SpringMVC 的Controller 的异常捕获提供了相应的异常处理。
ExceptionHandler Spring3.0提供的标识在方法上或类上的注解用来表明方法的处理异常类型。ControllerAdvice Spring3.2提供的新注解从名字上可以看出大体意思是控制器增强 在项目中来增强SpringMVC中的Controller。通常和 ExceptionHandler 结合使用来处理SpringMVC的异常信息。ResponseStatus Spring3.0提供的标识在方法上或类上的注解用状态代码和应返回的原因标记方法或异常类。 调用处理程序方法时状态代码将应用于HTTP响应。
通过上面的两个注解便可实现微服务端全局异常处理具体代码如下
Slf4jControllerAdvice//控制器增强
public class GlobalExceptionHandler {//处理XueChengPlusException异常// 此类异常是程序员主动抛出的可预知异常ResponseBody//将信息返回为 json格式ExceptionHandler(XueChengPlusException.class)//此方法捕获XueChengPlusException异常ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//状态码返回500public RestErrorResponse doXueChengPlusException(XueChengPlusException e){log.error(捕获异常{},e.getErrMessage());e.printStackTrace();String errMessage e.getErrMessage();//写异常处理的逻辑//....return new RestErrorResponse(errMessage);}//捕获不可预知异常 ExceptionResponseBody//将信息返回为 json格式ExceptionHandler(Exception.class)//此方法捕获Exception异常ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//状态码返回500public RestErrorResponse doException(Exception e){log.error(捕获异常{},e.getMessage());e.printStackTrace();if(e.getMessage().equals(不允许访问)){return new RestErrorResponse(没有操作此功能的权限);}return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());}ResponseBody//将信息返回为 json格式ExceptionHandler(MethodArgumentNotValidException.class)//此方法捕获MethodArgumentNotValidException异常ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//状态码返回500public RestErrorResponse doMethodArgumentNotValidException(MethodArgumentNotValidException e){BindingResult bindingResult e.getBindingResult();//校验的错误信息ListFieldError fieldErrors bindingResult.getFieldErrors();//收集错误StringBuffer errors new StringBuffer();fieldErrors.forEach(error-{errors.append(error.getDefaultMessage()).append(,);});return new RestErrorResponse(errors.toString());}}4.6.3 异常处理测试
在异常处理测试之前首先在代码中抛出自定义类型的异常这里以新增课程的service方法为例进行代码修改。 Overridepublic CourseBaseInfoDto createCourseBase(Long companyId,AddCourseDto dto) {...
//合法性校验if (StringUtils.isBlank(dto.getName())) {throw new XueChengPlusException(课程名称为空);}if (StringUtils.isBlank(dto.getMt())) {throw new XueChengPlusException(课程分类为空);}if (StringUtils.isBlank(dto.getSt())) {throw new XueChengPlusException(课程分类为空);}if (StringUtils.isBlank(dto.getGrade())) {throw new XueChengPlusException(课程等级为空);}if (StringUtils.isBlank(dto.getTeachmode())) {throw new XueChengPlusException(教育模式为空);}if (StringUtils.isBlank(dto.getUsers())) {throw new XueChengPlusException(适应人群);}if (StringUtils.isBlank(dto.getCharge())) {throw new XueChengPlusException(收费规则为空);}。。。if (201001.equals(charge)) {BigDecimal price dto.getPrice();if (ObjectUtils.isEmpty(price)) {throw new XueChengPlusException(收费课程价格不能为空);}courseMarketNew.setPrice(dto.getPrice().floatValue());}。。。1、首先使用httpclient测试
请求新增课程接口故意将必填项设置为空。
测试结果与预期一致可以捕获异常并响应异常信息如下
http://localhost:63040/content/courseHTTP/1.1 500
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 07 Sep 2022 13:17:14 GMT
Connection: close{errMessage: 处理异常请重试。
}2、前后端调试
仍然测试新增课程接口当课程收费的时候必须填写价格这里设置课程为收费价格设置为空。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3RhXU3C-1690971452584)()]
通过测试发现前端正常提示代码 中抛出的异常信息。 至此项目异常处理的测试完毕我们在开发中对于业务分支中错误的情况要抛出项目自定义的异常类型。