如何捕获 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(() -&gt; getWordsFromText(text)))

【讨论】:

以上是关于如何捕获 MonoError?的主要内容,如果未能解决你的问题,请参考以下文章

如何记录“捕获的”异常?

如何评论为啥可以忽略捕获

如何让 pytest 不捕获异常

如何在 Promise 的回调中捕获未捕获的异常

如何在 PHP 类型提示中捕获“可捕获的致命错误”?

Android 中如何捕获未捕获的异常