我正在使用Spring和项目反应堆中的运算符(Mono,Flux等),我的问题是关于错误处理。假设我有以下代码:
server {
listen 80;
server_name ~. "";
}
我想打印失败的val fluxOfNames : Flux<String> = ..
fluxOfNames.flatMap { name ->
externalResource.fetchInfo(name)
}.doOnError { throwable ->
// TODO How can I get the "name" that failed?
println("$name failed due to ${throwable.message")
}. ..
,但不在传递给name
afaik的lambda函数中。我可以将对doOnError
的调用包装在一个自定义异常中,该异常包含externalResource.fetchInfo(name)
参数的值,但是如果我必须在所有地方都这样做,它将很快变得很丑。
当name
不包含此信息时,我是否可以在name
lambda表达式中保留doOnError
的值?
答案 0 :(得分:1)
问题是,您假设doOnError
(或与此有关的任何onError*
运算符)处理的错误来自其上方的运算符。但实际上,它可以来自更深层次的链。或者它可能在终端信号期间出现,因此根本不与某个值相关联...
幸运的是,您正在使用flatMap
。只需将doOnError
放入 flatMap中,以便它仅捕获来自externalResource.fetchInfo
的错误。这样,name
仍在范围内,您可以在错误消息中使用它。