gpt4 book ai didi

java - 如何获取导致 Flux 异常的元素?

转载 作者:行者123 更新时间:2023-12-04 17:22:55 27 4
gpt4 key购买 nike

假设我有一个 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不是 element这导致了异常,但导致了异常的对象。它发生在我的处理方法内部,并且不必每次都是相同类型的对象。 .onErrorReturn(...) - 不是我想要的 .doOnError(error -> - 没有我的元素的信息 .onErrorResume(error -> - 同上
有人建议我可以创建自己的异常并将元素传递到那里,然后从异常中检索它。但是我应该如何抛出异常?
我是否应该采用旧的 try catch 方式:
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()))
看起来不太好
编辑:
不仅看起来不好,而且不起作用。异常根本没有捕获,直接触发 doOnTerminate()并停止整个流
更新:
感谢@JEY,我使用了 .onErrorResume()flatMap .
我还通过 Mono.defer(() -> Mono.just(processMyEl(el))) 将第一种方法转换为 react 流.
请注意:使用 Mono.defer()允许我使用 onErrorResumeMono.just() cannot signal errors.
最终代码如下所示:
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()
}

最佳答案

根据@Kamil 的要求,我将添加我的评论作为答案:
您应该只处理 flatMap 中的错误并返回 Mono.empty() 以丢弃它,执行以下操作:

Flux.fromArray(myArray)
.flatMap(el -> anotherProcess(processMyEl(el)).onErrorResume(th -> handleError(th, el))
处理错误如:
Mono<Void> handleError(Throwable th, Object element) {
LOG.error("An error occurred on {}", element, th);
return Mono.empty()
}
或者,如果您想做一些需要异步的更复杂的事情:
Mono<Void> handleError(Throwable th, Object element) {
return doSomethingThaReturnFluxOrMono(element).then();
}

关于java - 如何获取导致 Flux 异常的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65082037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com