RxJava 抛出异常或使用 onError
RxJava throwing an exception or using onError
有什么方法可以决定异常应该由返回 rxjava 类型的方法抛出还是应该通过 onError 传播?
如果我有一个方法应该在参数为 null 时抛出 NPE,那么这个异常应该由方法本身抛出还是通过返回的 observable/flowable 抛出?
作为最佳实践,您应该始终通过 onError
传播错误。否则,像这样调用您的方法的人最终将无法正确处理异常:
public void doStuff() {
someMethodReturningCompletable()
.andThen(yourMethodThatThrows(argument))
.subscribe(v -> { /* success */ }, err -> { /* this won't get called */);
}
如果您的方法在 argument
为 null 时立即抛出异常,则会发生两件坏事:
- 你甚至在
subscribe
调用执行之前抛出它,并且可能在 someMethodReturningCompletable()
实际执行之前抛出它(因为它还没有被订阅)。
- 异常不会传播到下游,它只是被抛入
doStuff()
,并且未设置为处理该异常。
我的想法是:onError
属于流,所以应该通知流相关的错误。 returns 流是方法契约的一部分的方法的参数,而不是流本身的一部分。
换句话说:创建流的问题与执行流的问题不同。
那么为什么要将违反方法约定的内容放入流中?我没有看到在调用方法时检查参数是否遵守某些先决条件以及在违反时抛出异常的问题。
此外,这也是许多 RxJava 方法的工作原理,例如Observable.just
和 Observable.range
.
有什么方法可以决定异常应该由返回 rxjava 类型的方法抛出还是应该通过 onError 传播? 如果我有一个方法应该在参数为 null 时抛出 NPE,那么这个异常应该由方法本身抛出还是通过返回的 observable/flowable 抛出?
作为最佳实践,您应该始终通过 onError
传播错误。否则,像这样调用您的方法的人最终将无法正确处理异常:
public void doStuff() {
someMethodReturningCompletable()
.andThen(yourMethodThatThrows(argument))
.subscribe(v -> { /* success */ }, err -> { /* this won't get called */);
}
如果您的方法在 argument
为 null 时立即抛出异常,则会发生两件坏事:
- 你甚至在
subscribe
调用执行之前抛出它,并且可能在someMethodReturningCompletable()
实际执行之前抛出它(因为它还没有被订阅)。 - 异常不会传播到下游,它只是被抛入
doStuff()
,并且未设置为处理该异常。
我的想法是:onError
属于流,所以应该通知流相关的错误。 returns 流是方法契约的一部分的方法的参数,而不是流本身的一部分。
换句话说:创建流的问题与执行流的问题不同。
那么为什么要将违反方法约定的内容放入流中?我没有看到在调用方法时检查参数是否遵守某些先决条件以及在违反时抛出异常的问题。
此外,这也是许多 RxJava 方法的工作原理,例如Observable.just
和 Observable.range
.