KotlinKotlin-Coroutines

Kotlin-runCatching

2021-02-05  本文已影响0人  有腹肌的豌豆Z

runCatching 源码

/**
 * Calls the specified function [block] with `this` value as its receiver and returns its encapsulated result if invocation was successful,
 * catching any [Throwable] exception that was thrown from the [block] function execution and encapsulating it as a failure.
 */
@InlineOnly
@SinceKotlin("1.3")
public inline fun <T, R> T.runCatching(block: T.() -> R): Result<R> {
    return try {
        Result.success(block())
    } catch (e: Throwable) {
        Result.failure(e)
    }
}

runCatching 函数返回的是一个 Result 类,Result 类中,一共定义了如上述的 4 个方法:

1.runCatching 的实现

runCatching 是一个内联的高阶函数,返回了一个 Result 类,函数里面对回调出去的 lambda 表达式进行了 try catch 的处理。返回的内容使用 Result.success 和 Result.failure 进行的包裹

2.getOrNull
@InlineOnly
public inline fun getOrNull(): T? =
       when {
            isFailure -> null
            else -> value as T
       }
}

异常的情况返回 null ,要么就是返回 value, value 是 Result 的一个属性,也就是上面使用 Result.success(block()) 中返回的结果

3.getOrDefault
public inline fun <R, T : R> Result<T>.getOrDefault(defaultValue: R): R {
    if (isFailure) return defaultValue
    return value as T
}

如果是异常的情况返回默认值,要么返回的是 value

4.getOrElse
public inline fun <R, T : R> Result<T>.getOrElse(onFailure: (exception: Throwable) -> R): R {
    contract {
        callsInPlace(onFailure, InvocationKind.AT_MOST_ONCE)
    }
    return when (val exception = exceptionOrNull()) {
        null -> value as T
        else -> onFailure(exception)
    }
}

先看看 exceptionOrNull 处理的是什么:

public fun exceptionOrNull(): Throwable? =
        when (value) {
            is Failure -> value.exception
            else -> null
        }

exceptionOrNull 返回的是: 如果是发生了异常返回异常类, 否则返回 null, 所以 getOrElse 里面返回的是: 异常情况下,返回异常类,否则返回处理的结果 value

上一篇下一篇

猜你喜欢

热点阅读