diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml
index 6bd725b3b5..c13dda63d5 100644
--- a/reactor-core/pom.xml
+++ b/reactor-core/pom.xml
@@ -41,8 +41,8 @@
- 3.3.9.RELEASE
+ 3.4.9
3.6.1
-
\ No newline at end of file
+
diff --git a/reactor-core/src/test/java/com/baeldung/reactor/exception/ExceptionUnitTest.java b/reactor-core/src/test/java/com/baeldung/reactor/exception/ExceptionUnitTest.java
new file mode 100644
index 0000000000..d1d2b3c4d6
--- /dev/null
+++ b/reactor-core/src/test/java/com/baeldung/reactor/exception/ExceptionUnitTest.java
@@ -0,0 +1,89 @@
+package com.baeldung.reactor.exception;
+
+import org.junit.Test;
+import org.reactivestreams.Publisher;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import reactor.core.publisher.SynchronousSink;
+import reactor.test.StepVerifier;
+
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+public class ExceptionUnitTest {
+ @Test
+ public void givenInvalidElement_whenPipelineThrowsException_thenErrorIsSentDownstream() {
+ Function mapper = input -> {
+ if (input.matches("\\D")) {
+ throw new NumberFormatException();
+ } else {
+ return Integer.parseInt(input);
+ }
+ };
+
+ Flux inFlux = Flux.just("1", "1.5", "2");
+ Flux outFlux = inFlux.map(mapper);
+
+ StepVerifier.create(outFlux)
+ .expectNext(1)
+ .expectError(NumberFormatException.class)
+ .verify();
+ }
+
+ @Test
+ public void givenInvalidElement_whenHandleCallsSinkErrorMethod_thenErrorIsSentDownstream() {
+ BiConsumer> handler = (input, sink) -> {
+ if (input.matches("\\D")) {
+ sink.error(new NumberFormatException());
+ } else {
+ sink.next(Integer.parseInt(input));
+ }
+ };
+
+ Flux inFlux = Flux.just("1", "1.5", "2");
+ Flux outFlux = inFlux.handle(handler);
+
+ StepVerifier.create(outFlux)
+ .expectNext(1)
+ .expectError(NumberFormatException.class)
+ .verify();
+ }
+
+ @Test
+ public void givenInvalidElement_whenFlatMapCallsMonoErrorMethod_thenErrorIsSentDownstream() {
+ Function> mapper = input -> {
+ if (input.matches("\\D")) {
+ return Mono.error(new NumberFormatException());
+ } else {
+ return Mono.just(Integer.parseInt(input));
+ }
+ };
+
+ Flux inFlux = Flux.just("1", "1.5", "2");
+ Flux outFlux = inFlux.flatMap(mapper);
+
+ StepVerifier.create(outFlux)
+ .expectNext(1)
+ .expectError(NumberFormatException.class)
+ .verify();
+ }
+
+ @Test
+ public void givenNullElement_whenPipelineOperatorExecutes_thenNpeIsSentDownstream() {
+ Function mapper = input -> {
+ if (input == null) {
+ return 0;
+ } else {
+ return Integer.parseInt(input);
+ }
+ };
+
+ Flux inFlux = Flux.just("1", null, "2");
+ Flux outFlux = inFlux.map(mapper);
+
+ StepVerifier.create(outFlux)
+ .expectNext(1)
+ .expectError(NullPointerException.class)
+ .verify();
+ }
+}