RxKotlin:试图添加自定义错误捕获

我试图写我自己的RxKotlin扩展函数,这将使Observable处理特定的错误类型( Throwable子类)与一个作为参数传递的处理程序,不会发出更多的项目。

大理石图将是:

 --- a --- b --- c --- error : T [ handleError<T>(handler) ] --- a --- b --- c --- finished | handler(error) 

我写了以下内容:

 public inline fun <reified E : Throwable, R> Observable<R>.handleError( crossinline handler: (E) -> Unit ) = onErrorResumeNext f@{ return@f when (e) { is E -> { handler(e); Observable.empty() } else -> Observable.error(e) } } 

它工作正常,但要使用它,我必须写,例如:

  val myObservable: Observable<SomeClass> = ... myObservable.handleError<IOException, SomeClass> { it.printStackTrace() } ^^^^^^^^^ 

我不喜欢它,我必须在handleError调用中编写Observable的泛型,我想避免它。

那么,有没有办法避免明确指定第二个泛型参数?

我想,一旦我指定了一个通用参数,就没有办法让编译器推断它。 但有没有办法重写handleErrors来实现我想要的?

首先,要明确指定E ,可以使用更详细的lambda语法。 这看起来像这样:

 myObservable.handleError { it : IOException -> it.printStackTrace() } 

或者,您可以添加一个附加参数来帮助编译器推断该类型。 这可能看起来像这样:

 public inline fun <reified E : Throwable, R> Observable<R>.handleError( typeHint: (E) -> Unit, crossinline handler: (E) -> Unit ) = onErrorResumeNext f@{ return@f when (e) { is E -> { handler(e); Observable.empty() } else -> Observable.error(e) } } fun <T> of() : (T) -> Unit = {} 

用法:

 myObservable.handleError(of<IOException>()) { it.printStackTrace() }