获取在Spring中引起异常的操作的输入值/上下文的惯用方式?

时间:2019-01-25 09:37:31

标签: spring-boot project-reactor

我正在使用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的值?

1 个答案:

答案 0 :(得分:1)

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

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