RxKotlin:尝试添加自定义错误捕获
RxKotlin: trying to add custom errors catching
我正在尝试为 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() }
我正在尝试为 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() }