From 63dac7b1b23cb3917c4df6c6073ecad4f227f79c Mon Sep 17 00:00:00 2001 From: Ben Christensen Date: Tue, 26 Aug 2014 09:32:36 -0700 Subject: [PATCH] Handle Fatal Exceptions They were being swallowed before this fix when doOn* operators were used. --- .../internal/operators/OperatorDoOnEach.java | 3 ++ .../operators/OperatorDoOnEachTest.java | 38 +++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/rxjava-core/src/main/java/rx/internal/operators/OperatorDoOnEach.java b/rxjava-core/src/main/java/rx/internal/operators/OperatorDoOnEach.java index 99fab1319a..27c3309a1f 100644 --- a/rxjava-core/src/main/java/rx/internal/operators/OperatorDoOnEach.java +++ b/rxjava-core/src/main/java/rx/internal/operators/OperatorDoOnEach.java @@ -18,6 +18,7 @@ import rx.Observable.Operator; import rx.Observer; import rx.Subscriber; +import rx.exceptions.Exceptions; import rx.exceptions.OnErrorThrowable; /** @@ -54,6 +55,8 @@ public void onCompleted() { @Override public void onError(Throwable e) { + // need to throwIfFatal since we swallow errors after terminated + Exceptions.throwIfFatal(e); if (done) { return; } diff --git a/rxjava-core/src/test/java/rx/internal/operators/OperatorDoOnEachTest.java b/rxjava-core/src/test/java/rx/internal/operators/OperatorDoOnEachTest.java index 7de9f78e25..68e8ad4064 100644 --- a/rxjava-core/src/test/java/rx/internal/operators/OperatorDoOnEachTest.java +++ b/rxjava-core/src/test/java/rx/internal/operators/OperatorDoOnEachTest.java @@ -15,7 +15,7 @@ */ package rx.internal.operators; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -28,6 +28,8 @@ import rx.Observable; import rx.Observer; +import rx.Subscriber; +import rx.exceptions.OnErrorNotImplementedException; import rx.functions.Action1; import rx.functions.Func1; @@ -121,7 +123,7 @@ public void call(String s) { @Test public void testIssue1451Case1() { // https://github.com/Netflix/RxJava/issues/1451 - int[] nums = {1, 2, 3}; + int[] nums = { 1, 2, 3 }; final AtomicInteger count = new AtomicInteger(); for (final int n : nums) { Observable @@ -147,7 +149,7 @@ public void call(List booleans) { @Test public void testIssue1451Case2() { // https://github.com/Netflix/RxJava/issues/1451 - int[] nums = {1, 2, 3}; + int[] nums = { 1, 2, 3 }; final AtomicInteger count = new AtomicInteger(); for (final int n : nums) { Observable @@ -169,4 +171,34 @@ public void call(List booleans) { } assertEquals(nums.length, count.get()); } + + @Test + public void testFatalError() { + try { + Observable.just(1, 2, 3) + .flatMap(new Func1>() { + @Override + public Observable call(Integer integer) { + return Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber o) { + throw new NullPointerException("Test NPE"); + } + }); + } + }) + .doOnNext(new Action1() { + @Override + public void call(Object o) { + System.out.println("Won't come here"); + } + }) + .subscribe(); + fail("should have thrown an exception"); + } catch (OnErrorNotImplementedException e) { + assertTrue(e.getCause() instanceof NullPointerException); + assertEquals(e.getCause().getMessage(), "Test NPE"); + System.out.println("Received exception: " + e); + } + } }