如何捕获 MonoError?
Posted
技术标签:
【中文标题】如何捕获 MonoError?【英文标题】:How can catch MonoError? 【发布时间】:2021-12-11 18:33:33 【问题描述】:我需要捕获 MonoError 并使用 ErrorResponse 停止应用程序,但应用程序按我预期的方式运行。
我的代码:
return checkText(text)
.then(getWordsFromText(text))
.map(keyWords -> new SuccessfulResponse(keyWords))
.onErrorResume(
throwable ->
return Mono.just(new ErrorResponse(throwable.getMessage()));
);
public Mono<Void> checkText(String text)
if (text == null)
return Mono.error(new Exception("wrong text"));
return Mono.empty();
我的问题是,如果 text 参数是 null -> 我属于 getWordsFromText 方法。这是不正确的执行,因为如果 text 参数等于 null,则应用程序必须退出并出现错误(带有 ErrorResponse)。
我将其修复为(将 'then' 替换为 'flatMap'):
return checkText(text)
.flatMap(voidParam -> getWordsFromText(text)) //replaced 'then' to 'flatMap'
.map(keyWords -> new SuccessfulResponse(keyWords))
.onErrorResume(
throwable ->
return Mono.just(new ErrorResponse(throwable.getMessage()));
);
现在它可以正常工作了。如果 text 参数为 null,我会错过调用 getWordsFromText 方法并陷入错误处理 (onErrorResume)。 p>
但我认为在我的情况下使用 flatMap 不是一个好主意,我不喜欢它的外观:.flatMap(voidParam -> ...
您有什么想法可以做得更好吗? (没有'flatMap')
【问题讨论】:
我建议检查这个答案:***.com/questions/57870706/… 【参考方案1】:在第一个 sn-p 中,对 getWordsFromText()
的调用是在构建主反应管道时进行的,甚至在它被订阅之前(即在组装时)。它在第二个 sn-p 中按预期工作的原因是 flatMap
仅在从上游接收元素时(即在订阅时)创建内部发布者(并随后订阅它们)。
在这种情况下,如果你想替换 flatMap
,你可以试试这个:.then(Mono.fromCallable(() -> getWordsFromText(text)))
【讨论】:
以上是关于如何捕获 MonoError?的主要内容,如果未能解决你的问题,请参考以下文章