当前位置: 首页 > 后端技术 > Python

测试开发主题:spring-boot自定义异常返回

时间:2023-03-26 17:03:32 Python

上面测试开发主题:spring-boot统一异常捕获我们讨论了java异常以及如何使用Spring-Boot来捕获异常,但是没有讲到捕获之后如何更进一步异常在本文中,我们将讨论这个遗留问题。统一的错误响应定义我们希望当程序出现异常时,能够给用户返回一个友好、清晰的信息。对于API接口,比较好的格式是json,类似如下格式{"code":"10001","message":"message","uri":"Get/v2/banner"}这样一个对象就是需要描述此数据格式:publicclassUnifyResponse{privateintcode;私人字符串消息;私有字符串requestUri;publicUnifyResponse(intcode,Stringmessage,StringrequestUri){this.code=code;this.message=消息;this.requestUri=requestUri;}}错误响应处理上面我们提到,从开发者的角度来看,异常分为已知异常和未知异常。不同的异常处理函数用于处理不同的异常。我们之前定义了两个处理函数@ControllerAdvicepublicclassGlobalExceptionAdvice{/***Handleunknownexception*@paramreq*@paramex*/@ExceptionHandler(value=Exception.class)publicvoidhandleHttpException(HttpServletRequestreq,Exceptionex){System.out.println("发生异常");}/***处理已知异常*@paramreq*@paramex*/@ExceptionHandler(value=HttpException.class)publicvoidhandleHttpException(HttpServletRequestreq,HttpExceptionex){System.out.println("HttpExceptionoccurred");}}当发生未知异常时,异常信息需要存储在UnifyResponse中,序列化后返回给用户@ExceptionHandler(value=Exception.class)publicUnifyResponsehandleHttpException(HttpServletRequestreq,Exceptionex){Stringuri=req.getRequestURI();字符串方法=req.getMethod();系统输出。println(ex.getMessage());returnnewUnifyResponse(9999,"服务器错误",方法+""+uri);}我们不知道未知异常发生了什么,所以这里的代码定义了一个通用的,虽然Exception中有消息,但是不建议将这个异常中的消息返回给用户。这个可能会涉及到一些代码结构上的东西,即使这个信息返回给前端,他也不知道是什么问题,没什么。意思就是,所以这个消息可以写入日志,这样问题查询后返回给用户的消息可以定制一个通用的,比如服务器错误什么的。让我们测试它并在控制器中抛出一个异常:}然后在浏览器中访问,发现这里的异常是错误的。我不明白。回到异常处理方法。我们直接返回UnifyResponse对象。如果这里返回的是字符串,就不会出错,再试一次,结果还是会报这个错,也就是说这里无论返回自定义对象还是字符串都会有问题,也就是说,spring-boot可能根本认不出我们。的东西。spring-boot中有一个注解@ResponseBody,可以将我们的返回值绑定到response的body上。让我们试试看能不能解决这个问题。你会发现上面修改的String返回可以成功,但是UnifyResponse对象的返回还是报错,而且报错和前面的不一样。刚才报的错误还是404,现在变成了500,哪里错了?让我们看一下UnifyResponse的定义。我们定义了三个私有成员变量,但是没有定义getter方法。那么在序列化的时候就获取不到成员变量的值,所以报错。这里我们添加:然后在运行程序的时候,访问路由:返回的response和我们预期的一样,但是从上图可以看出返回的状态码是200,这明显是错误的,因为服务器已经出错了,状态码应该是500,所以这里需要自定义状态码。自定义状态码spring-boot提供了两种自定义状态码的方式:注解直接在异常处理函数上标记一个@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR),指定状态码的枚举值来重启程序和访问路由:可以看到状态码变成了500。虽然上面使用注解的形式可以达到我们的目的,但是这种方式不是很灵活。这里的很多响应设置都是spring-boot帮我们完成的。如果需要做一些定制,就不是很方便了。那么这种下来的方式确实可以让我们通过代码灵活的进行控制。ResponseEntityResponseEntity是一个泛型类,可以直接返回,可以设置很多属性,包括status,headers,body等。使用ResponseEntity自定义已知异常处理方法的返回信息:然后在Controller中抛出NotFoundException,重新运行程序,访问路由:可以看到并返回正确的状态码。综上所述,我们介绍了如何定义错误响应以及如何返回自定义错误消息,以及通过多种方式自定义状态码。但是,我们文章中的错误信息都是硬编码在代码中的,非常难管理。那么在下一篇文章中我们将介绍如何管理错误信息,敬请期待!!!本文链接:https://www.immortalp.com/art...欢迎来到我的博客,还有更多关于实测的内容!!