我有一个捕获可恢复异常并返回回退的功能
private fun <T> safely(block: () -> T, fallback: T): T {
return try {
block()
} catch(exc: SomeException) {
// Log the exception/do some logic
fallback
}
}
我希望能够将此添加到类的公共方法中,例如
fun doSomething(): List<String> = safely({
val list = mutableListOf<String>("Hello")
fun someCheck1() = false // Some boolean value
fun someCheck2() = true // Some boolean value
do {
if(someCheck2()) {
return arrayListOf<String>("Hello", "World")
}
} while (someCheck1())
return list
}, arrayListOf<String>())
但是我遇到编译器错误'return' is not allowed here
但是,如果我删除了return
,那么循环中的返回值将不再起作用,并且它会在IDE中突出显示,并显示警告the expression is never used
如何在Lambda中维护这种类型的返回逻辑?
答案 0 :(得分:2)
尝试
fun doSomething(): List<String> = safely(
{
val list = mutableListOf<String>("Hello")
fun someCheck1() = false // Some boolean value
fun someCheck2() = true // Some boolean value
do {
if (someCheck2()) {
return@safely arrayListOf<String>("Hello", "World")
}
} while (someCheck1())
list
}
, arrayListOf<String>())
有关更多参考,请选中Using return inside a lambda?
或者您也可以将代码块提取到一个单独的函数(即someCheckFunction(): List<String>
)中,并拥有fun doSomething() = safely({ someCheckFunction() }, arrayListOf())
,但是我想您想像上面那样维护lambda代码。
答案 1 :(得分:1)
return arrayListOf<String>("Hello", "World")
在这里尝试从doSomething
函数而不是从传递给safely
的lambda返回值。但是,这种返回是非本地的,因为它试图从不在堆栈顶部的函数退出,因此被禁止。
这里的另一种选择是使safely
函数内联:
inline fun <T> safely(block: () -> T, fallback: T): T { ... }
然后您就可以通过传递给它的block
lambda函数进行非本地返回。