Java 如何获取导致通量异常的元素?

Java 如何获取导致通量异常的元素?,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,假设我有一个ID数组:[9,8,7,6] 我做了一些处理,一个元素导致抛出异常。我希望以自己的方式处理这种情况(比如说记录),并让其他元素随波逐流 我怎么知道是哪一个?我需要在我的onError处理中使用此元素 Flux.fromArray(myArray) .flatMap(element -> { var foo = processMyEl(element); return anotherProcess(foo); // this returns Mono

假设我有一个ID数组:
[9,8,7,6]

我做了一些处理,一个元素导致抛出异常。我希望以自己的方式处理这种情况(比如说记录),并让其他元素随波逐流

我怎么知道是哪一个?我需要在我的
onError
处理中使用此元素

Flux.fromArray(myArray)
  .flatMap(element -> {
    var foo = processMyEl(element);  
    return anotherProcess(foo); // this returns Mono
  })
  .onErrorOperator(element -> handleMyError(element)) // this line is what I need
  
所以,我看到的是,有一个几乎不错的
.onErrorContinue((error,obj)->
发出一个错误和一个对象

但是这个
obj
不是导致异常的
元素,而是导致异常的对象。它发生在我的处理方法中,并且不必每次都是相同类型的对象

.onerrorrurn(…)
-这不是我想要的

.doon错误(错误->
-没有我的元素的信息

.onErrorResume(错误->
-同上

有人建议我可以创建自己的异常并将元素传递到那里,然后从异常中检索它。但是我应该如何抛出异常呢

我是否应该采用一种古老的试捕方式:

Flux.fromArray(myArray)
  .flatMap(el -> {
    try {
      var foo = processMyEl(el);  
      return anotherProcess(foo); // this returns Mono
    } catch (Exception e) {
      return Mono.error(new MyException(el));
     }
    })
  .onErrorOperator(error -> handleMyError(error.getElement()))
看起来不太好

编辑:

它不仅看起来很糟糕,而且也不起作用。根本不会捕获异常并直接触发
doInterminate()
并停止整个流

更新:

多亏了@JEY,我才在
flatMap
中使用了
.onErrorResume()

我还通过
Mono.defer(()->Mono.just(processMyEl(el))
将第一个方法转换为反应流

请注意:使用
Mono.defer()
允许我使用
onErrorResume
因为
Mono.Just()

最终代码如下所示:

Flux.fromArray(myArray)
    .flatMap(element -> Mono.defer(() -> Mono.just(processMyEl(element)))
        .onErrorResume(th -> handleMyError(element, th))
    )
    .flatMap(foo -> anotherProcess(foo)
        .onErrorResume(th -> handleMyError(foo, th)
    )
其中:

private Mono<> handleMyError(el, th) {
  // handling code
  return Mono.empty()
}
private Mono handleMyError(el,th){
//处理代码
返回Mono.empty()
}

根据@Kamil的要求,我将添加我的评论作为回答:

您应该只处理flatMap中的错误,并返回Mono.empty()以放弃它,执行如下操作:

Flux.fromArray(myArray)
.flatMap(el->另一个进程(processMyEl(el)).onErrorResume(th->handleError(th,el))
具有如下句柄错误:

Mono handleError(可丢弃的th,对象元素){
error(“在{}上发生错误”,元素,th);
返回Mono.empty()
}
或者,如果您想做一些更复杂的需要异步的事情:

Mono handleError(可丢弃的th,对象元素){
返回doSomethingThaReturnFluxOrMono(元素).then();
}

您应该使用旧的try catch,但不要返回Mono of error handle并返回Mono.empty()这样你的错误就不会在下游被看到,流量将不断被消耗。是的,我试图在catch子句中包含我的逻辑,但代码甚至没有到达那里,只是终止了我的流,这就是说,如果它没有到达,这意味着错误被抛出到其他地方。如果没有更多信息,我们将无法提供帮助。不,它被抛出了ide是这两个方法中的一个,但是由于有一个方法返回
Mono
——正如我在问题中提到的,并且异常可以在那里抛出,它不会被try-catch捕获,因为它不再在它的范围内。你是对的!我还做了一件事,就是完全摆脱try-catch,并通过
Mono转换为反应流(processMyEl(el))
然后应用
OneRorResume
,就像你建议的那样,请随意发布答案,我会接受;我也会发布我的最终代码我不能在平面图中的catch子句中抛出异常,返回Mono.error(new MyException(el))
返回Flux.error(new MyException(el))
是向下游发出异常信号的正确方法
} catch (Exception e) {
    throw new MyException(el, e);
}