Skip to content

Commit 5b92876

Browse files
Change onError(Exception) to onError(Throwable)
See issue "Observer#onError should use Throwable" for background => #296
1 parent 52595d3 commit 5b92876

File tree

57 files changed

+403
-388
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+403
-388
lines changed

rxjava-core/src/main/java/rx/Notification.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
public class Notification<T> {
2424

2525
private final Kind kind;
26-
private final Exception exception;
26+
private final Throwable exception;
2727
private final T value;
2828

2929
/**
@@ -44,7 +44,7 @@ public Notification(T value) {
4444
* @param exception
4545
* The exception passed to the onError notification.
4646
*/
47-
public Notification(Exception exception) {
47+
public Notification(Throwable exception) {
4848
this.exception = exception;
4949
this.value = null;
5050
this.kind = Kind.OnError;
@@ -62,9 +62,9 @@ public Notification() {
6262
/**
6363
* Retrieves the exception associated with an onError notification.
6464
*
65-
* @return The exception associated with an onError notification.
65+
* @return Throwable associated with an onError notification.
6666
*/
67-
public Exception getException() {
67+
public Throwable getThrowable() {
6868
return exception;
6969
}
7070

@@ -126,7 +126,7 @@ public String toString() {
126126
if (hasValue())
127127
str.append(" ").append(getValue());
128128
if (hasException())
129-
str.append(" ").append(getException().getMessage());
129+
str.append(" ").append(getThrowable().getMessage());
130130
str.append("]");
131131
return str.toString();
132132
}
@@ -137,7 +137,7 @@ public int hashCode() {
137137
if (hasValue())
138138
hash = hash * 31 + getValue().hashCode();
139139
if (hasException())
140-
hash = hash * 31 + getException().hashCode();
140+
hash = hash * 31 + getThrowable().hashCode();
141141
return hash;
142142
}
143143

@@ -154,7 +154,7 @@ public boolean equals(Object obj) {
154154
return false;
155155
if (hasValue() && !getValue().equals(notification.getValue()))
156156
return false;
157-
if (hasException() && !getException().equals(notification.getException()))
157+
if (hasException() && !getThrowable().equals(notification.getThrowable()))
158158
return false;
159159
return true;
160160
}

rxjava-core/src/main/java/rx/Observable.java

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -205,14 +205,14 @@ public Subscription subscribe(Observer<T> observer) {
205205
} catch (OnErrorNotImplementedException e) {
206206
// special handling when onError is not implemented ... we just rethrow
207207
throw e;
208-
} catch (Exception e) {
208+
} catch (Throwable e) {
209209
// if an unhandled error occurs executing the onSubscribe we will propagate it
210210
try {
211211
observer.onError(hook.onSubscribeError(this, e));
212212
} catch (OnErrorNotImplementedException e2) {
213213
// special handling when onError is not implemented ... we just rethrow
214214
throw e2;
215-
} catch (Exception e2) {
215+
} catch (Throwable e2) {
216216
// if this happens it means the onError itself failed (perhaps an invalid function implementation)
217217
// so we are unable to propagate the error correctly and will just throw
218218
RuntimeException r = new RuntimeException("Error occurred attempting to subscribe [" + e.getMessage() + "] and then again while trying to pass to onError.", e2);
@@ -295,7 +295,7 @@ public void onCompleted() {
295295
}
296296

297297
@Override
298-
public void onError(Exception e) {
298+
public void onError(Throwable e) {
299299
handleError(e);
300300
Object onError = callbacks.get("onError");
301301
if (onError != null) {
@@ -344,7 +344,7 @@ public void onCompleted() {
344344
}
345345

346346
@Override
347-
public void onError(Exception e) {
347+
public void onError(Throwable e) {
348348
handleError(e);
349349
throw new OnErrorNotImplementedException(e);
350350
}
@@ -379,7 +379,7 @@ public void onCompleted() {
379379
}
380380

381381
@Override
382-
public void onError(Exception e) {
382+
public void onError(Throwable e) {
383383
handleError(e);
384384
throw new OnErrorNotImplementedException(e);
385385
}
@@ -421,7 +421,7 @@ public void onCompleted() {
421421
}
422422

423423
@Override
424-
public void onError(Exception e) {
424+
public void onError(Throwable e) {
425425
handleError(e);
426426
Functions.from(onError).call(e);
427427
}
@@ -438,7 +438,7 @@ public Subscription subscribe(final Object onNext, final Object onError, Schedul
438438
return subscribeOn(scheduler).subscribe(onNext, onError);
439439
}
440440

441-
public Subscription subscribe(final Action1<T> onNext, final Action1<Exception> onError) {
441+
public Subscription subscribe(final Action1<T> onNext, final Action1<Throwable> onError) {
442442
if (onNext == null) {
443443
throw new IllegalArgumentException("onNext can not be null");
444444
}
@@ -459,7 +459,7 @@ public void onCompleted() {
459459
}
460460

461461
@Override
462-
public void onError(Exception e) {
462+
public void onError(Throwable e) {
463463
handleError(e);
464464
onError.call(e);
465465
}
@@ -472,7 +472,7 @@ public void onNext(T args) {
472472
});
473473
}
474474

475-
public Subscription subscribe(final Action1<T> onNext, final Action1<Exception> onError, Scheduler scheduler) {
475+
public Subscription subscribe(final Action1<T> onNext, final Action1<Throwable> onError, Scheduler scheduler) {
476476
return subscribeOn(scheduler).subscribe(onNext, onError);
477477
}
478478

@@ -504,7 +504,7 @@ public void onCompleted() {
504504
}
505505

506506
@Override
507-
public void onError(Exception e) {
507+
public void onError(Throwable e) {
508508
handleError(e);
509509
Functions.from(onError).call(e);
510510
}
@@ -521,7 +521,7 @@ public Subscription subscribe(final Object onNext, final Object onError, final O
521521
return subscribeOn(scheduler).subscribe(onNext, onError, onComplete);
522522
}
523523

524-
public Subscription subscribe(final Action1<T> onNext, final Action1<Exception> onError, final Action0 onComplete) {
524+
public Subscription subscribe(final Action1<T> onNext, final Action1<Throwable> onError, final Action0 onComplete) {
525525
if (onNext == null) {
526526
throw new IllegalArgumentException("onNext can not be null");
527527
}
@@ -545,7 +545,7 @@ public void onCompleted() {
545545
}
546546

547547
@Override
548-
public void onError(Exception e) {
548+
public void onError(Throwable e) {
549549
handleError(e);
550550
onError.call(e);
551551
}
@@ -558,7 +558,7 @@ public void onNext(T args) {
558558
});
559559
}
560560

561-
public Subscription subscribe(final Action1<T> onNext, final Action1<Exception> onError, final Action0 onComplete, Scheduler scheduler) {
561+
public Subscription subscribe(final Action1<T> onNext, final Action1<Throwable> onError, final Action0 onComplete, Scheduler scheduler) {
562562
return subscribeOn(scheduler).subscribe(onNext, onError, onComplete);
563563
}
564564

@@ -583,7 +583,7 @@ public <R> ConnectableObservable<R> multicast(Subject<T, R> subject) {
583583
*
584584
* @param e
585585
*/
586-
private void handleError(Exception e) {
586+
private void handleError(Throwable e) {
587587
// onError should be rare so we'll only fetch when needed
588588
RxJavaPlugins.getInstance().getErrorHandler().handleError(e);
589589
}
@@ -618,7 +618,7 @@ public Subscription call(Observer<T> t1) {
618618
*/
619619
private static class ThrowObservable<T> extends Observable<T> {
620620

621-
public ThrowObservable(final Exception exception) {
621+
public ThrowObservable(final Throwable exception) {
622622
super(new Func1<Observer<T>, Subscription>() {
623623

624624
/**
@@ -956,7 +956,7 @@ public static <T> Observable<T> empty() {
956956
* @return an Observable that invokes the {@link Observer}'s
957957
* {@link Observer#onError onError} method when the Observer subscribes to it
958958
*/
959-
public static <T> Observable<T> error(Exception exception) {
959+
public static <T> Observable<T> error(Throwable exception) {
960960
return new ThrowObservable<T>(exception);
961961
}
962962

@@ -1767,7 +1767,7 @@ public static <T> Observable<T> never() {
17671767
* encounters an error
17681768
* @return an Observable, identical to the source Observable with its behavior modified as described
17691769
*/
1770-
public static <T> Observable<T> onErrorResumeNext(final Observable<T> that, final Func1<Exception, Observable<T>> resumeFunction) {
1770+
public static <T> Observable<T> onErrorResumeNext(final Observable<T> that, final Func1<Throwable, Observable<T>> resumeFunction) {
17711771
return create(OperationOnErrorResumeNextViaFunction.onErrorResumeNextViaFunction(that, resumeFunction));
17721772
}
17731773

@@ -1800,11 +1800,11 @@ public static <T> Observable<T> onErrorResumeNext(final Observable<T> that, fina
18001800
public static <T> Observable<T> onErrorResumeNext(final Observable<T> that, final Object resumeFunction) {
18011801
@SuppressWarnings("rawtypes")
18021802
final FuncN _f = Functions.from(resumeFunction);
1803-
return onErrorResumeNext(that, new Func1<Exception, Observable<T>>() {
1803+
return onErrorResumeNext(that, new Func1<Throwable, Observable<T>>() {
18041804

18051805
@SuppressWarnings("unchecked")
18061806
@Override
1807-
public Observable<T> call(Exception e) {
1807+
public Observable<T> call(Throwable e) {
18081808
return (Observable<T>) _f.call(e);
18091809
}
18101810
});
@@ -1866,7 +1866,7 @@ public static <T> Observable<T> onErrorResumeNext(final Observable<T> that, fina
18661866
* would otherwise cause it to invoke {@link Observer#onError onError}
18671867
* @return an Observable, identical to the source Observable with its behavior modified as described
18681868
*/
1869-
public static <T> Observable<T> onErrorReturn(final Observable<T> that, Func1<Exception, T> resumeFunction) {
1869+
public static <T> Observable<T> onErrorReturn(final Observable<T> that, Func1<Throwable, T> resumeFunction) {
18701870
return create(OperationOnErrorReturn.onErrorReturn(that, resumeFunction));
18711871
}
18721872

@@ -3537,7 +3537,7 @@ public Observable<T> observeOn(Scheduler scheduler) {
35373537
* @return an Observable that emits the items and notifications embedded in the
35383538
* {@link Notification} objects emitted by the source Observable
35393539
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229047(v=vs.103).aspx">MSDN: Observable.dematerialize</a>
3540-
* @throws Exception
3540+
* @throws Throwable
35413541
* if the source Observable is not of type {@code Observable<Notification<T>>}.
35423542
*/
35433543
@SuppressWarnings("unchecked")
@@ -3571,7 +3571,7 @@ public <T2> Observable<T2> dematerialize() {
35713571
* encounters an error
35723572
* @return the original Observable, with appropriately modified behavior
35733573
*/
3574-
public Observable<T> onErrorResumeNext(final Func1<Exception, Observable<T>> resumeFunction) {
3574+
public Observable<T> onErrorResumeNext(final Func1<Throwable, Observable<T>> resumeFunction) {
35753575
return onErrorResumeNext(this, resumeFunction);
35763576
}
35773577

@@ -3601,11 +3601,11 @@ public Observable<T> onErrorResumeNext(final Func1<Exception, Observable<T>> res
36013601
public Observable<T> onErrorResumeNext(final Object resumeFunction) {
36023602
@SuppressWarnings("rawtypes")
36033603
final FuncN _f = Functions.from(resumeFunction);
3604-
return onErrorResumeNext(this, new Func1<Exception, Observable<T>>() {
3604+
return onErrorResumeNext(this, new Func1<Throwable, Observable<T>>() {
36053605

36063606
@Override
36073607
@SuppressWarnings("unchecked")
3608-
public Observable<T> call(Exception e) {
3608+
public Observable<T> call(Throwable e) {
36093609
return (Observable<T>) _f.call(e);
36103610
}
36113611
});
@@ -3664,7 +3664,7 @@ public Observable<T> onErrorResumeNext(final Observable<T> resumeSequence) {
36643664
* Observable encounters an error
36653665
* @return the original Observable with appropriately modified behavior
36663666
*/
3667-
public Observable<T> onErrorReturn(Func1<Exception, T> resumeFunction) {
3667+
public Observable<T> onErrorReturn(Func1<Throwable, T> resumeFunction) {
36683668
return onErrorReturn(this, resumeFunction);
36693669
}
36703670

@@ -3694,11 +3694,11 @@ public Observable<T> onErrorReturn(Func1<Exception, T> resumeFunction) {
36943694
public Observable<T> onErrorReturn(final Object resumeFunction) {
36953695
@SuppressWarnings("rawtypes")
36963696
final FuncN _f = Functions.from(resumeFunction);
3697-
return onErrorReturn(this, new Func1<Exception, T>() {
3697+
return onErrorReturn(this, new Func1<Throwable, T>() {
36983698

36993699
@Override
37003700
@SuppressWarnings("unchecked")
3701-
public T call(Exception e) {
3701+
public T call(Throwable e) {
37023702
return (T) _f.call(e);
37033703
}
37043704
});
@@ -4376,7 +4376,7 @@ public Subscription call(Observer<String> Observer) {
43764376
verify(aObserver, times(1)).onNext("one");
43774377
verify(aObserver, times(1)).onNext("two");
43784378
verify(aObserver, times(1)).onNext("three");
4379-
verify(aObserver, Mockito.never()).onError(any(Exception.class));
4379+
verify(aObserver, Mockito.never()).onError(any(Throwable.class));
43804380
verify(aObserver, times(1)).onCompleted();
43814381
}
43824382

@@ -4453,7 +4453,7 @@ public void testMaterializeDematerializeChaining() {
44534453

44544454
verify(observer, times(1)).onNext(1);
44554455
verify(observer, times(1)).onCompleted();
4456-
verify(observer, times(0)).onError(any(Exception.class));
4456+
verify(observer, times(0)).onError(any(Throwable.class));
44574457
}
44584458

44594459
/**
@@ -4467,7 +4467,7 @@ public void testMaterializeDematerializeChaining() {
44674467
public void testCustomObservableWithErrorInObserverAsynchronous() throws InterruptedException {
44684468
final CountDownLatch latch = new CountDownLatch(1);
44694469
final AtomicInteger count = new AtomicInteger();
4470-
final AtomicReference<Exception> error = new AtomicReference<Exception>();
4470+
final AtomicReference<Throwable> error = new AtomicReference<Throwable>();
44714471
Observable.create(new Func1<Observer<String>, Subscription>() {
44724472

44734473
@Override
@@ -4499,7 +4499,7 @@ public void onCompleted() {
44994499
}
45004500

45014501
@Override
4502-
public void onError(Exception e) {
4502+
public void onError(Throwable e) {
45034503
error.set(e);
45044504
System.out.println("error");
45054505
e.printStackTrace();
@@ -4533,7 +4533,7 @@ public void onNext(String v) {
45334533
@Test
45344534
public void testCustomObservableWithErrorInObserverSynchronous() {
45354535
final AtomicInteger count = new AtomicInteger();
4536-
final AtomicReference<Exception> error = new AtomicReference<Exception>();
4536+
final AtomicReference<Throwable> error = new AtomicReference<Throwable>();
45374537
Observable.create(new Func1<Observer<String>, Subscription>() {
45384538

45394539
@Override
@@ -4553,7 +4553,7 @@ public void onCompleted() {
45534553
}
45544554

45554555
@Override
4556-
public void onError(Exception e) {
4556+
public void onError(Throwable e) {
45574557
error.set(e);
45584558
System.out.println("error");
45594559
e.printStackTrace();
@@ -4584,7 +4584,7 @@ public void onNext(String v) {
45844584
@Test
45854585
public void testCustomObservableWithErrorInObservableSynchronous() {
45864586
final AtomicInteger count = new AtomicInteger();
4587-
final AtomicReference<Exception> error = new AtomicReference<Exception>();
4587+
final AtomicReference<Throwable> error = new AtomicReference<Throwable>();
45884588
Observable.create(new Func1<Observer<String>, Subscription>() {
45894589

45904590
@Override
@@ -4601,7 +4601,7 @@ public void onCompleted() {
46014601
}
46024602

46034603
@Override
4604-
public void onError(Exception e) {
4604+
public void onError(Throwable e) {
46054605
error.set(e);
46064606
System.out.println("error");
46074607
e.printStackTrace();
@@ -4803,7 +4803,7 @@ public void call(Object t1) {
48034803

48044804
});
48054805
fail("expected exception");
4806-
} catch (Exception e) {
4806+
} catch (Throwable e) {
48074807
assertEquals("failure", e.getMessage());
48084808
}
48094809
}
@@ -4822,7 +4822,7 @@ public void call(Object t1) {
48224822
@Test
48234823
public void testErrorThrownWithoutErrorHandlerAsynchronous() throws InterruptedException {
48244824
final CountDownLatch latch = new CountDownLatch(1);
4825-
final AtomicReference<Exception> exception = new AtomicReference<Exception>();
4825+
final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
48264826
Observable.create(new Func1<Observer<String>, Subscription>() {
48274827

48284828
@Override
@@ -4833,7 +4833,7 @@ public Subscription call(final Observer<String> observer) {
48334833
public void run() {
48344834
try {
48354835
observer.onError(new RuntimeException("failure"));
4836-
} catch (Exception e) {
4836+
} catch (Throwable e) {
48374837
// without an onError handler it has to just throw on whatever thread invokes it
48384838
exception.set(e);
48394839
}

rxjava-core/src/main/java/rx/Observer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public interface Observer<T> {
4242
*
4343
* @param e
4444
*/
45-
public void onError(Exception e);
45+
public void onError(Throwable e);
4646

4747
/**
4848
* Provides the Observer with new data.

0 commit comments

Comments
 (0)