Kotlin-runCatching

作者: 有腹肌的豌豆Z | 来源:发表于2021-02-05 16:24 被阅读0次

    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 个方法:

    • 其中 getOrNull 返回的是 runCatching 中处理的结果,是一个可空类型的。
    • getOrDefault 返回的是一个不可空的类型,调用的时候需要传递默认值,为 null 的时候会返回默认值。
    • getOrThrow 未发生的异常返回的是 runCatching 中处理的结果,如果 runCatching 中发生了异常,调用这个 API 会抛出异常。
    • getOrElse 返回处理的结果,或者是异常自己处理。
    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

    相关文章

      网友评论

        本文标题:Kotlin-runCatching

        本文链接:https://www.haomeiwen.com/subject/uhqgtltx.html