当前位置: 首页 > 知识库问答 >
问题:

如何处理Reactive Spring webflux中的错误

丘华翰
2023-03-14

由于有很多方法,如onErrorReturn、onErrorResume等,所以哪一个是正确的方法,以处理mono和flux的Reactive Spring webflux中的错误?

共有1个答案

徐翔
2023-03-14

分享我的知识:

总共提供了六种处理错误的方法,下面讨论五种:

>

  • OnErrorReturn:返回整个流的回退值(Mono/Flux)。例如。如果有10个元素的流量,并且元素3发生错误,那么rest 4、5、6…将不会被执行,相反,将考虑回退值。

    DoonError:消耗错误并溢出它。停止执行流中的其他元素。

    OnErrorMap:将一个错误转换为另一个错误。停止执行流中的其他元素。

    所有这五种方法都有三种变体,

      null

    示例:

    1. OnErrorReturn:返回回退值
    @Test
    public void onErrorReturnDirectly_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorReturn(4)
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void onErrorReturnIfArithmeticException_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorReturn(ArithmeticException.class, 4)
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void onErrorReturnIfPredicatePasses_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorReturn(error -> error instanceof ArithmeticException, 4)
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void onErrorResume_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorResume(error -> Mono.just(4))
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void onErrorResumeIfArithmeticException_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorResume(
                ArithmeticException.class,
                error -> Mono.just(4)
            )
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void onErrorResumeIfPredicatePasses_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorResume(
                error -> error instanceof ArithmeticException,
                error -> Mono.just(4)
            )
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void onErrorContinue_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorContinue((error, obj) -> log.info("error:[{}], obj:[{}]", error, obj ))
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void onErrorContinueIfArithmeticException_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorContinue(
                ArithmeticException.class,
                (error, obj) -> log.info("error:[{}], obj:[{}]", error, obj )
            )
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void onErrorContinueIfPredicatePasses_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorContinue(
                error -> error instanceof ArithmeticException,
                (error, obj) -> log.info("error:[{}], obj:[{}]", error, obj )
            )
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void doOnError_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .doOnError(error -> log.info("caught error"))
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void doOnErrorIfArithmeticException_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .doOnError(
                ArithmeticException.class,
                error -> log.info("caught error")
            )
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void doOnErrorIfPredicatePasses_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .doOnError(
                error -> error instanceof ArithmeticException,
                error -> log.info("caught error")
            )
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void OnErrorMap_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorMap(error -> new RuntimeException("SomeMathException"))
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void OnErrorMapIfArithmeticException_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorMap(
                ArithmeticException.class,
                error -> new RuntimeException("SomeMathException")
            )
            .subscribe(num -> log.info("Number: {}", num ));
    }
    
    @Test
    public void OnErrorMapIfPredicatePasses_Mono() {
        Mono.just(2)
            .map(i -> i/0) // will produce ArithmeticException
            .onErrorMap(
                error -> error instanceof ArithmeticException,
                error -> new RuntimeException("SomeMathException")
            )
            .subscribe(num -> log.info("Number: {}", num ));
    }
    

  •  类似资料:
    • 问题内容: 作为节点程序员。我习惯于使用“ nodebacks”来处理代码中的错误: 编写该函数时,我可以执行以下操作: 我如何用promises处理这种错误? 问题答案: 经验法则 每当您对如何使用Promise有所疑问时,请考虑一下同步版本。 至少对我来说,这比第一个参数有时是的回调要干净得多。 promises方式几乎总是与问题的同步版本非常相似: 使用回调函数时,myFn看起来像什么: 使

    • 我有以下Kafka配置类: 以及以下KafkaListener: 我想使用<code>SeekToCurrentErrorHandler</code>进行错误处理,我想使用类似于这里的特定功能,但目前我正在使用<code>springBootVersion=2.0.4。你能帮我设置依赖项和配置以处理Kafka消费者中的错误吗? 问候!

    • 本文向大家介绍如何处理HTML5 Web Worker中的错误?,包括了如何处理HTML5 Web Worker中的错误?的使用技巧和注意事项,需要的朋友参考一下 下面显示了Web Worker JavaScript文件中错误处理功能的示例,该功能将错误记录到控制台。 示例

    • 问题内容: 我试图弄清楚如何使用boto3进行正确的错误处理。 我正在尝试创建一个IAM用户: 成功调用create_user后,我得到一个整洁的对象,其中包含API调用的http状态代码和新创建的用户的数据。 例: 这很好。但是,如果失败(例如用户已经存在),我只会得到一个类型为botocore.exceptions.ClientError的对象,其中只有文本可以告诉我出了什么问题。 示例:Cl

    • 问题内容: 如何处理此调用上的etimedout错误? 有没有办法等待更长的时间?还是再次请求远程文件? 究竟是什么会导致此错误?仅超时? 问题答案: 这是由于在给定时间内未收到您的请求响应(通过 请求模块选项)引起的。 基本上首先要捕获该错误,您需要在上注册一个处理程序,因此不会再抛出未处理的错误:。这里还有一些解释。 在处理程序中,您可以检查错误是否为ETIMEDOUT并应用自己的逻辑:。 如

    • 问题内容: 假设我有以下jQuery AJAX调用: 现在,当进行此AJAX调用时,我希望服务器端代码通过一些错误处理检查来运行(例如,用户是否仍在登录,他们是否有权使用此调用,数据是否有效,等等)。如果检测到错误,如何将错误消息冒泡回客户端? 我最初的想法是返回一个带有两个字段的JSON对象:error和errorMessage。然后将在jQuery AJAX调用中检查以下字段: 这对我来说有点