Java 如何获取导致通量异常的元素?
假设我有一个ID数组: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
[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);
}