RxJava校验对象列表时如何为异常项填充reason错误原因字段
核心改造思路
原有实现的问题是:任意元素校验抛出异常会直接终止整个流,触发下游全局onError,无法将异常和对应元素绑定,也无法继续处理剩余元素。改造核心是在单个元素的处理逻辑中捕获所有异常,不中断整体流,直接将状态和异常信息写入对应TestModel实例。
具体实现代码
1. 先添加异常堆栈转字符串的工具方法
fun Throwable.getStackTraceString(): String { val sw = StringWriter() val pw = PrintWriter(sw) printStackTrace(pw) pw.flush() return sw.toString() }
2. 改造ViewModel的validateList方法
(注:默认你的TestModel中已补充缺失的val jsonString: String?属性)
fun validateList(list: List<TestModel>): Single<List<TestModel>> { return Observable.fromIterable(list) .flatMapSingle { testModel -> // 单个元素的处理逻辑完全独立,异常不会影响其他元素 val verifySingle = try { val json = testModel.jsonString ?: throw IllegalStateException("Json must not be null") VerifiableObject(json).validate() } catch (t: Throwable) { // 捕获预处理阶段抛出的同步异常 Single.error(t) } verifySingle .map { isPass -> // 处理校验返回结果 testModel.isVerified = isPass.toString() if (!isPass) { // 校验不通过的自定义提示,可按需修改 testModel.reason = "内容校验不通过" } testModel } .onErrorReturn { t -> // 捕获该元素所有校验相关异常,写入reason testModel.isVerified = false.toString() testModel.reason = t.getStackTraceString() testModel } } .toList() }
补充说明
- 不需要修改Fragment侧原有代码,所有元素级的错误都会被写入对应TestModel的reason字段,只有全局不可恢复错误才会触发下游的onError回调
- 不需要再通过索引匹配原始列表和校验结果,避免索引错位问题
内容的提问来源于stack exchange,提问作者Anshul Tyagi
相关产品推荐
相关产品推荐

