You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可实现someKindOfCode.tryCatch()调用的Kotlin扩展函数

问题分析

你编写的Any扩展函数无法达到预期效果的核心原因是代码求值时机错误:当你调用xxx.tryCatch()时,xxx代表的代码逻辑会先完成执行、得到结果值后,才会触发结果实例的tryCatch扩展方法。此时try块中仅持有已经计算完成的结果值,根本不会捕获代码执行过程中抛出的异常。

正确实现方案

你需要将扩展函数的接收者改为无参函数类型,利用Lambda的惰性执行特性,让目标代码逻辑在try块内部才执行:

private fun <T> (() -> T).tryCatch(): T? {
    return try {
        // 此处才真正执行传入的代码逻辑
        this()
    } catch (e: Exception) {
        Log.e(TAG, "tryCatch: ", e)
        // 异常场景可根据需求调整返回值,比如返回默认值而非null
        null
    }
}
调用方式

和你预期的调用形式完全匹配,将需要执行的代码放入Lambda作为接收者即可:

{
    // 此处放置需要异常捕获的业务代码
    val riskyResult = 100 / 0
    otherRiskyMethod()
}.tryCatch()

如果你需要拿到代码的执行返回值,直接接收方法返回结果即可:

val result = { getRiskyData() }.tryCatch()

内容的提问来源于stack exchange,提问作者Alireza Mahfouzian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:15:03