【问题标题】:RxKotlin: trying to add custom errors catchingRxKotlin:尝试添加自定义错误捕获
【发布时间】:2015-12-26 22:53:55
【问题描述】:

我正在尝试为 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 来实现我想要的吗?

【问题讨论】:

    标签: generics rx-java kotlin


    【解决方案1】:

    首先,要明确指定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() }
    

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多