当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《RxKotlin:尝试添加自定义错误捕获》经验,为你挑选了1个好方法。

我正在尝试为RxKotlin编写自己的扩展函数,这将使Observable句柄成为一个特定的错误类型(Throwable子类),其处理程序作为参数传递并且不再发出任何项目.

大理石图将是:

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

[   handleError(handler)   ]

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

我写了以下内容:

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

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

 val myObservable: Observable = ...

 myObservable.handleError { it.printStackTrace() }
                                       ^^^^^^^^^

我不喜欢我必须ObservablehandleError电话中写出通用,我想避免它.

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

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



1> Kirill Rakhm..:

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

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

或者,您可以添加一个额外的参数来帮助编译器推断出类型.这看起来像这样:

public inline fun  Observable.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  of() : (T) -> Unit = {}

用法:

myObservable.handleError(of()) { it.printStackTrace() }

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有