Идиоматический способ получить вводное значение / контекст операции, вызвавшей исключение в Spring? - PullRequest
0 голосов
/ 25 января 2019

Я использую 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. Я мог бы, вероятно, обернуть вызов к externalResource.fetchInfo(name) в пользовательское исключение, содержащее значение параметра name, но это быстро становится уродливым, если мне придется делать это повсеместно.

Могу ли я получить значение name в лямбда-выражении doOnError, когда throwable не содержит эту информацию?

1 Ответ

0 голосов
/ 28 января 2019

Дело в том, что вы предполагаете, что ошибка, обработанная doOnError (или любым оператором onError* в этом отношении), исходит от оператора, расположенного непосредственно над ним. Но на самом деле, это может прийти дальше по цепочке. Или это может произойти во время сигнала терминала, таким образом, не связанного со значением вообще ...

В вашем случае, к счастью, вы используете flatMap. Просто поместите doOnError в flatMap, чтобы он фиксировал только ошибки из externalResource.fetchInfo. Таким образом, name все еще находится в области видимости, и вы можете использовать его в сообщении об ошибке.

...