获取在 Spring 中导致异常的操作的输入 value/context 的惯用方法?

Idiomatic way to get a hold of the input value/context of the operation that caused an exception in Spring?

我正在使用 Spring 和来自项目反应器的操作员(Mono、Flux 等),我的问题是关于错误处理。假设我有这段代码:

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,但它不在传递给 doOnError afaik 的 lambda 函数的范围内。我可能可以将对 externalResource.fetchInfo(name) 的调用包装在一个包含 name 参数值的自定义异常中,但如果我必须在所有地方都这样做,它很快就会变得丑陋。

throwable 不包含此信息时,有没有办法让我在 doOnError lambda 表达式中获取 name 的值?

问题是您假设由 doOnError(或与此相关的任何 onError* 运算符)处理的错误来自其正上方的运算符。但实际上,它可能来自链条的更上游。或者它可以在终端信号期间出现,因此根本不与值关联...

幸运的是,您使用的是 flatMap。只需将 doOnError 放在 中,这样它就只捕获来自 externalResource.fetchInfo 的错误。这样 name 仍在范围内,您可以在错误消息中使用它。