Generic – rxkotlin: attempt to add custom error capture

I'm trying to write my own extension function for rxkotlin, which will make observable handle a specific error type (throwable subclass), and its handler will be passed as a parameter and no more items will be issued

The marble will be:

--- a --- b --- c --- error : T

[   handleError<T>(handler)   ]

--- a --- b --- c --- finished
                   |
             handler(error)

I wrote the following:

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)
        }
    }

It works normally, but to use it, I must write, for example:

val myObservable: Observable<SomeClass> = ...

 myObservable.handleError<IOException,SomeClass> { it.printStackTrace() }
                                       ^^^^^^^^^

I don't like that I have to write observable generics in the handleerror call, and I want to avoid it

So, is there any way to avoid explicitly specifying the second general parameter?

I think once I specify a generic parameter, there is no way for the compiler to infer it But is there a way to rewrite handleerrors to achieve what I want?

Solution

First, to specify e explicitly, you can use more detailed lambda syntax It looks like this:

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

Alternatively, you can add an additional parameter to help the compiler infer the type It looks like this:

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 = {}

Usage:

myObservable.handleError(of<IOException>()) { it.printStackTrace() }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>