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

205 天前
 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 不够简洁

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

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

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

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

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

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

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

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

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