You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:54:05