请教一下,你们写接口的时候如果传入参数不合法,返回的结果是直接提示参数非法还是报错?

2022-12-26 11:22:09 +08:00
 InHello

比如有一个查询车辆详情的接口,参数定义的是车牌号,但是我做接口测试可能会传入纯数字、英文、null 等等这些正常参数外的其他字符。 我司返回来的结果直接报 java 错误,在我的理解中如果参数非法,返回的接口应该是提示用户"参数非法"而不是直接报一个 java 错误,不知道对不对。

6667 次点击
所在节点    程序员
54 条回复
xuanbg
2022-12-26 12:49:22 +08:00
直接抛异常那就是懒。嗯嗯,虽然我有时候也这样。
spring 是可以在实体类的字段上通过注解来对参数进行校验的。如果不是实体类,那也可以自己写校验逻辑。然后抛参数非法的异常出去就好了。

虽然,这样做意义其实也不是很大。但作为一个有追求的程序员,优雅是必须的。
Felldeadbird
2022-12-26 13:32:32 +08:00
按理来说应该提示非法参数。 估计后端没做处理,当非法提交后涉及到异常报错了,触发了 java 错误。

前端的做法应该是根据 code 或者 status 返回结果 执行对应的提示页或错误页。
hhjswf
2022-12-26 14:19:32 +08:00
说明没有做全局异常处理。
zypy333
2022-12-26 14:19:44 +08:00
我想起来我的奇葩同事,写个传入楼层返回该楼层门禁点位 list ,然后他硬是写了个如果查不到数据手动抛个异常,但是实际上有的楼层确实是没有门禁报警器的,然后他还不愿意改,最后是前台想办法单独处理,遇到那个楼层,直接不请求后台
zypy333
2022-12-26 14:30:50 +08:00
他应该不上 v 站

```java
public TableDataInfo list(@PathVariable String floor) throws Exception {
EntrancePoint entrancePoint=new EntrancePoint();
List<PublicEquipment> listOfep=new ArrayList<>();
List<EntrancePoint> list=null;
if(floor.isEmpty()){
throw new Exception("Please enter the number of floors");
}else {
entrancePoint.setFloor(floor);
list = entrancePointService.selectEntrancePointList(entrancePoint);
if(list.isEmpty()){
throw new Exception("The set or list cannot be empty!");
}else{
for (EntrancePoint entrancePoints:list) {
PublicEquipment pe =new PublicEquipment();
pe.setDeviceName(entrancePoints.getName());
pe.setIp(entrancePoints.getEntranceHost());
pe.setModelName(entrancePoints.getModelName());
pe.setState(entrancePoints.getEntranceStatus().equals("0")?"开启":"关闭");
pe.setDoorNum(entrancePoints.getVariable());
listOfep.add(pe);
}
}
}
return getDataTable(listOfep);
}
```
kop1989smurf
2022-12-26 14:34:49 +08:00
不能任凭异常抛出。

1 、异常需要全局处理,要有对应的类型编号、唯一编号、日志记录。
2 、未处理的异常会增大 web 容器的开销。
3 、不利于其他产品进行统一的错误提示。
InHello
2022-12-26 14:41:15 +08:00
@Felldeadbird 对的 就是这样的,但是前端也没有做任何异常处理
InHello
2022-12-26 14:41:58 +08:00
@zypy333 就是这种
InHello
2022-12-26 14:42:40 +08:00
@kop1989smurf 我感觉我司他们就没有做任何处理
YouTing
2022-12-26 15:30:00 +08:00
前后端都没有写校验,也没有抛出异常。前端至少要对 500 等未知错误进行提示,因为不知道什么时候就出奇奇怪怪的的问题,有提示用户就知道这一步不能干,后端的参数校验是必写的
zoharSoul
2022-12-26 15:32:19 +08:00
如果用户正常操作不会碰见的 case, 那什么文案无所谓的
Macolor21
2022-12-26 16:00:18 +08:00
spring validation 这么难学吗?
chioplkijhman
2022-12-26 16:20:15 +08:00
422 Unprocessable Entity
libook
2022-12-26 16:42:58 +08:00
直接包 Java 错误是不是意味着根本没做错误处理?

具体还是得形成标准,而标准不唯一。主要的目的还是利于联调以及前端进行错误展示,比如对所有的情况划分业务状态码。
ThreeK
2022-12-26 17:14:42 +08:00
Validation 加 Exception Handling 。自己代码直接参数异常抛出去,项目统一拦截返回,每块代码都各司其职。
msg7086
2022-12-26 17:40:08 +08:00
抛异常可以但是最顶层要接住异常然后返回正确的 JSON/XML 主体啊。
zsj1029
2022-12-26 18:52:08 +08:00
@zypy333 我也会这样写,这个习惯个人来看挺好的,但是全局必须有个 catch 拦截,转可读格式数据给前端,我说的是接口的情况。如果是 sdk 调用,调用方处理异常也是可以接受的
devswork
2022-12-26 20:41:25 +08:00
@NotBlank("车牌不能为空值")
@Pattern(regexp = "正则",message = "车牌格式不合法")
@Length(min = 7,max = 7,message="车牌必须为 7 位")
private String number;
devswork
2022-12-26 20:44:25 +08:00
@devswork 我们每个接口都得定义入参 VO ,以及出参 VO ,然后每个 VO 上的每个参数都要加 validation 判断 null 、判断空字符串、判断长度等,必要时候加正则校验,然后写一个统一异常处理器,处理 BindException 、MethodArgumentNotValidException 、ConstraintViolationException ,如果异常是属于业务上定义的,自己封装一个 Exception 和定义一个返回码,用来表示数据不符合业务规定。
FawkesV
2022-12-26 20:47:12 +08:00
@devswork #38 正规做法就这样, 对入参进行校验就好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/904703

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX