Java 开发新手,请教一个在进行业务代码开发时遇到的问题

293 天前
vegetablefriend  vegetablefriend

Excel 解析,需要处理每个单元格,并把解析出有问题的单元格汇总起来导出,如果都没有问题继续执行流程

遂设计函数如下:

public Object parse(Cell cell) {
    if (wrongFormat(cell)) {
        reutrn null;
    }
    
  return getContent(cell);
}

但是后面发现需要把「具体的错误格式信息」也导出出来,这样我就想到了下面两种设计:

public class Response {
    String errorMessage;
    Object parseResult;
}

public Response parse(Cell cell) {
    if (wrongFormat(cell)) {
        return response;
    }
    
  return response;
}

public Object parse(Cell cell) {
    if (wrongFormat(cell)) {
      throw new Exception("wrong info");
    }
    
  return getContent(cell);
}

纠结第一种的原因:总感觉这种应用内的,不涉及前端调用和其他微服务交互的函数,返回这种 Response 不够简洁

纠结第二种的原因:这种纯格式的校验(判空、单元格类型)等,是否适合用抛出异常的方式控制流程?

不知道该如何选择,场景是后台场景批量导入,并发量应该比较低

2518 次点击
所在节点   Java  Java
15 条回复
RedBeanIce
RedBeanIce
293 天前
建议,直接报错即可。在最外层统一拦截,,,

至于报错展示一个,还是展示所有。。。可以实际情况而定。
NotFoundEgg
NotFoundEgg
293 天前
定义一个业务异常类,外部只 catch 这个类型做处理
crudbychang
crudbychang
293 天前
可以考虑把错误信息用标记再批注写回,用 EasyExcel 可以很容易做
vivisidea
vivisidea
293 天前
```
public class Response {
// enum errorType;
String errorMessage;
Object parseResult;
}
```

建议是第一种,增加一个 enum errorType ,便于上层分类处理,要不然要直接处理字符串

这个是 wrongFormat 里面能预见的 error ,不应该由异常来封装,exception 留给真正的异常( npe 这种)
yidinghe
yidinghe
293 天前
首先,你要的是汇总,所以是不是要等全部单元格检查完了,再输出汇总结果?而不是遇到一个错误,就立刻抛出异常中止检查?

其次,你的汇总结果当中要包含什么有价值的信息?是否要包含单元格的位置,单元格的内容,以及为什么有问题?所以你的 Response 里面是不是应该有一个 List ?
vegetablefriend
vegetablefriend
293 天前
vegetablefriend
vegetablefriend
293 天前
@yidinghe

1. 是的 所以需要对每个检查单元格内容方法,都环绕 try-catch 处理(个人认为比较蠢,但可以简化返回值结构)
2. 这个 Response 是指对每个单元格内容的检查的返回结果
vegetablefriend
293 天前
最外层统一拦截,就不能做到每个单元格内容都检查完了,再汇总结果了
vegetablefriend
293 天前
@crudbychang 提供了一个新的思路,👍
vegetablefriend
293 天前
vegetablefriend
293 天前
@vivisidea 我的 mentor 也建议是这种方式

跑个题,v 站这个回复功能有点诡异,经常莫名其妙发一条空的回复出去,刚才给另外一位老哥回复就已经发生了一次...
xubeiyou
293 天前
用 easyexcel 解析后逐行处理 之后做字符串拼接 拼接后放在单独的列里面。存储下来就导出了,之前就这么做的 支持大概 10W 以内的吧 默认情况下 如果需要大数据量的话 就得分 sheet 解析了
k9990009
293 天前
你这个需求我搞过,大量的 excel 模板要校验,用的 easypoi,先解析成业务 POI 对象,再验证,解析和验证职责分开,不建议直接用 cell 。
对象实现一个支持收集错误信息的接口,去收集每一行的错误信息。校验方式有单字段格式校验、行与行校验、列与列校验,与外部数据源校验。有错误信息,额外加一列导出。还做了错误单元格标红,用的是每个字段都额外创建额外字段标记的,使用反射获取这个额外字段。校验都尽量抽成规则,后面做了个在线编辑版,校验代码才发现没法复用。
xywanghb
293 天前
易于变化的业务考虑适当扩展, 不易于变化的要高度内聚并极大可能的降低理解成本维护成本,怎么简单怎么来, 我个人感觉这个不易于变化, 推荐第二种
yusheng88
292 天前
我实际开发中的处理:
1. 上传文件后,在业务表中插入一条待验证记录,响应上传成功
2. 定时读取待验证记录,流式读文件,逐行检验,在单元格内用[]记录验证失败原因,输出到新文件。有异常则上传新文件。
3. 修改验证状态

整体就是加个用户上传记录,后台异步检验的思路。
如果是对接服务端的,追求实时性,还可以主动回调/推送检验结果

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

https://www.v2ex.com/t/1037017

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

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

© 2021 V2EX