Rav*_*oni 23 java project-reactor spring-webflux
由于有很多方法onErrorReturn,例如onErrorResume等,那么哪一个是正确的方法来处理 Reactive Spring WebFlux 中单声道和通量的错误?
Rav*_*oni 71
分享我的知识:
\n总共提供了六种方法来处理错误,下面讨论其中五种:
\nonErrorReturn:返回整个流(mono/flux)的后备值。例如,如果有\xe2\x80\x99s 10个元素的通量,并且元素3上发生错误,则剩余的4,5,6\xe2\x80\xa6将不会执行\xe2\x80\x99,而是将执行回退值予以考虑。
\nonErrorResume:返回整个流(mono/flux)的 Mono/Flux 的后备值。例如,如果有\xe2\x80\x99s 10个元素的通量,并且元素3上发生错误,则剩余的4,5,6\xe2\x80\xa6将不会执行\xe2\x80\x99,而是将执行回退值予以考虑。
\nonErrorContinue:消耗(错误,数据)并且不将其拆分。它会考虑错误元素的消费者,而将下游链保留为好的元素。例如,如果有\xe2\x80\x99s 10个元素的通量,并且元素3上发生错误,则除3之外的所有元素(1到10)都将正常执行,但元素3将具有消费者中提到的不同执行onErrorContinue 的
\ndoOnError:消耗错误并将其溢出。停止执行流中的其他元素。
\nonErrorMap:将一个错误转换为另一个错误。停止执行流中的其他元素。
\n所有这五种方法都有 3 种变体,
\n例子:
\n@Test\npublic void onErrorReturnDirectly_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorReturn(4)\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void onErrorReturnIfArithmeticException_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorReturn(ArithmeticException.class, 4)\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void onErrorReturnIfPredicatePasses_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorReturn(error -> error instanceof ArithmeticException, 4)\n .subscribe(num -> log.info("Number: {}", num ));\n}\nRun Code Online (Sandbox Code Playgroud)\n@Test\npublic void onErrorResume_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorResume(error -> Mono.just(4))\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void onErrorResumeIfArithmeticException_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorResume(\n ArithmeticException.class,\n error -> Mono.just(4)\n )\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void onErrorResumeIfPredicatePasses_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorResume(\n error -> error instanceof ArithmeticException,\n error -> Mono.just(4)\n )\n .subscribe(num -> log.info("Number: {}", num ));\n}\nRun Code Online (Sandbox Code Playgroud)\n@Test\npublic void onErrorContinue_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorContinue((error, obj) -> log.info("error:[{}], obj:[{}]", error, obj ))\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void onErrorContinueIfArithmeticException_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorContinue(\n ArithmeticException.class,\n (error, obj) -> log.info("error:[{}], obj:[{}]", error, obj )\n )\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void onErrorContinueIfPredicatePasses_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorContinue(\n error -> error instanceof ArithmeticException,\n (error, obj) -> log.info("error:[{}], obj:[{}]", error, obj )\n )\n .subscribe(num -> log.info("Number: {}", num ));\n}\nRun Code Online (Sandbox Code Playgroud)\n@Test\npublic void doOnError_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .doOnError(error -> log.info("caught error"))\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void doOnErrorIfArithmeticException_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .doOnError(\n ArithmeticException.class,\n error -> log.info("caught error")\n )\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void doOnErrorIfPredicatePasses_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .doOnError(\n error -> error instanceof ArithmeticException,\n error -> log.info("caught error")\n )\n .subscribe(num -> log.info("Number: {}", num ));\n}\nRun Code Online (Sandbox Code Playgroud)\n@Test\npublic void OnErrorMap_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorMap(error -> new RuntimeException("SomeMathException"))\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void OnErrorMapIfArithmeticException_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorMap(\n ArithmeticException.class,\n error -> new RuntimeException("SomeMathException")\n )\n .subscribe(num -> log.info("Number: {}", num ));\n}\n\n@Test\npublic void OnErrorMapIfPredicatePasses_Mono() {\n Mono.just(2)\n .map(i -> i/0) // will produce ArithmeticException\n .onErrorMap(\n error -> error instanceof ArithmeticException,\n error -> new RuntimeException("SomeMathException")\n )\n .subscribe(num -> log.info("Number: {}", num ));\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
31554 次 |
| 最近记录: |