是否有可能在lambdas上有功能扩展?

时间:2017-03-30 13:50:33

标签: lambda exception-handling kotlin

我想检查某些代码是否会引发确定的异常。

特别是,对于我的情况,我想写得像:

{shaderCodeOf(gl, this::class.java, data + "$FRAGMENT_FAIL.frag")} shallThrow GLException::java.class

我试着写

infix fun (() -> Unit).shallThrow(java: Class<*>)

但我没有取得多大成功..

任何想法,伙计们?

2 个答案:

答案 0 :(得分:4)

在lambdas上声明扩展函数没有问题。

infix fun (()->Unit).shallThrow(java: Class<out Throwable>) {
    // do whatever you need                 ^ you mean this, didn't you?
}

然后:

{} shallThrow RuntimeException::class.java

答案 1 :(得分:3)

不是你的问题的直接答案(lambdas上的接收方法),但你可以使用另一种实现方式:

inline fun <reified T: Throwable> assertThrows(fn: (() -> Unit)) {
    try {
        fn()
    } catch (e: Throwable) {
        if (e is T) {
            return
        } else {
            fail("Expected ${T::class} but caught ${e::class}")
        }
    }
    fail("Expected ${T::class} but caught nothing.")
}

您可以将其用作assertThrows<MyException> { doStuff(); }