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

如何让所有流触发onFailure 解决getSomething报错时onFailure不触发问题

问题根因

该现象的核心原因是 this.restClient.getSomething() 调用时直接同步抛出了异常,而非返回携带失败信号的 Uni 实例。异常抛出发生在响应流构建完成之前,未进入Mutiny的流管理链路,因此挂载在流上的 onFailure 回调无法捕获。
而doSomething是在flatMap回调的流运行阶段执行,即使同步抛出异常,Mutiny也会自动将其转换为流的失败信号,所以可以被onFailure正常捕获。

修复方案

使用 Uni.deferred() 包裹初始的getSomething调用,它会捕获Supplier函数内抛出的所有同步异常,自动转换为失败的Uni流入后续处理链路,即可实现全链路异常捕获:

Uni.createFrom().deferred(() -> this.restClient.getSomething())
  .flatMap(something -> this.restClient.doSomething())
  .flatMap(res -> Uni.createFrom().item(Response.ok().build()))
  .onFailure().transform(e -> {
    LOG.error("Failed with", e);
    // 注意:transform回调建议直接返回异常对象,而非手动抛出,符合Mutiny的API规范
    return new InternalServerErrorException("Failed!");
  });

补充排查点

如果上述方案仍未解决,可以检查以下配置:

  • 确认getSomething方法的返回类型确实为Uni<T>,而非同步返回普通对象,同步返回的接口异常会直接抛出,不会进入Uni流处理
  • 确认getSomething调用后到第一个flatMap前没有其他吞掉异常的操作节点

内容的提问来源于stack exchange,提问作者Eldelshell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:06